题意:

      给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案。

思路:

      状态压缩dp,记录方案数的地方我用的是类似并查集的方法,记录当前状态是那个状态转移过来的,<输出的时候可以 异或 出来>,对于字典序最小,这个比较好处理,给的是升序的,所以直接更新的时候记录就行了,<如果没给可以sort下>,我是开了一个dp[i]表示i状态时的最小扣分,然后在开一个数组time[i],记录dp[i]是对应的当前时间,然后每一个状态都用n个作业更新下,的到最优就行了,下面给出关键代码和ac代码

for(j = 0 ;j <= (1 << n) - 1 ;j ++)

for(i = 1 ;i <= n ;i ++)

{

   int tt = time[j] + node[i].cost - node[i].end;

   if(tt < 0) tt = 0;

   if(dp[j|(1<<(i-1)))] > dp[j] + tt)

   {

       mer[j|(1<<(i-1))] = j;//记录路径

        dp[j|(1<<(i-1))] = dp[j] + tt;

      time[j|(1<<(i-1))] = time[j] + node[i].cost;

   }

}

答案等于 dp[(1<<1)-1] 

然后是输出路径    

int x = (1 << n) - 1;

int id = 0;

while(x != mer[x])

{

   Ans[++id] = x ^ mer[x];

   x = mer[x];

}

for(i = n ;i >= 1 ;i --)

printf("%s\n" ,node[log2(Ans[i])+1].str);   





#include<stdio.h>
#include<string.h>
#include<math.h>

typedef struct
{
int
end ,cost;
char
str[110];
}
NODE; NODE node[20];
int
dp[1<<16];
int
Time[1<<16];
int
mer[1<<16];
int
Ans[20]; int minn(int x ,int y)
{
return
x < y ? x : y;
} int
maxx(int x ,int y)
{
return
x > y ? x : y;
} int main ()
{
int
t ,n ,i ,j;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d" ,&n);
for(
i = 1 ;i <= n ;i ++)
scanf("%s %d %d" ,node[i].str ,&node[i].end ,&node[i].cost);
for(
i = 0 ;i <= 1 << n ;i ++)
dp[i] = 1000000000 ,Time[i] = 0 ,mer[i] = i;
dp[0] = 0;
for(
j = 0 ;j <= (1 << n)-1 ;j ++)
for(
i = 1 ;i <= n ;i ++)
{
int
tt = Time[j] + node[i].cost - node[i].end;
if(
tt < 0) tt = 0;
if(
dp[j|(1<<(i-1))] > dp[j] + tt)
{

mer[j|(1<<(i-1))] = j;
dp[j|(1<<(i-1))] = dp[j] + tt;
Time[j|(1<<(i-1))] = Time[j] + node[i].cost;
}
}

printf("%d\n" ,dp[(1<<n)-1]);
int
x = (1<<n) - 1;
int
id = 0;
while(
x != mer[x])
{

Ans[++id] = x ^ mer[x];
x = mer[x];
}
for(
i = n ;i >= 1 ;i --)
printf("%s\n" ,node[int(log2(Ans[i]))+1].str);
}
return
0;
}

     

最新文章

  1. js中的块作用域
  2. Spring中获取数据库表主键序列
  3. Angular ngClick 阻止冒泡和默认行为
  4. C#多线程管理代码
  5. iOS开发之网络编程--使用NSURLConnection实现大文件下载
  6. css模块化思想(一)--------命名是个技术活
  7. [POJ2234]Matches Game
  8. Android Audio 分析
  9. Asp.Net WebApi+Microsoft.AspNet.WebApi.Core 启用CORS跨域访问
  10. cocos2d的-X- luaproject的LUA脚本加密
  11. C#窗体多语言切换(简繁)
  12. SSM-SpringMVC-30:SpringMVC中InitBinder的骇客级优化
  13. C# ComboBox绑定值问题
  14. 基于Hexo搭建个人博客网站
  15. MySQL中的isnull、ifnull和nullif函数用法
  16. Linux服务器可以进百度,但是进阿里云或者别的一些网站提示‘错误代码:NS_ERROR_NET_INADEQUATE_SECURITY’的问题
  17. 识别简单的答题卡(Bubble sheet multiple choice scanner and test grader using OMR, Python and OpenCV——jsxyhelu重新整编)
  18. 关于Tomcat配置虚拟路径保存、访问图片
  19. redis在游戏服务器中的使用初探(三) 信息存储
  20. AutoCAD.net-错误消息大全

热门文章

  1. PAT-1066(Root of AVL Tree)Java语言实现
  2. window 10 下 --excel | power query 通过 ODBC链接 mysql 数据库
  3. 【odoo14】第四章、应用模型
  4. 绿色物流-智慧仓储监控管理 3D 可视化系统
  5. Mac下安装lightgb并在jupyter中使用
  6. 7、MyBatis教程之分页实现
  7. 1、MyBatis教程之环境准备和简介
  8. [系统重装日志2]win10系统安装pytorch0.4.1(gpu版本)
  9. React 错误边界组件
  10. Redis解读(2):Redis的Java客户端