【状态压缩dp】HDU - 1074 Doing Homework
2017-08-12 19:37
465 查看
Problem Description
给你T组测试数据,每组测试数据给你一个N(1<=N<=15) 接下来有N行,每行分别代表需要做作业的科目,截止时间,完成需要花费的时间。如果不能在截止时间完成作业,那么考试分数就会被扣分,超出几天,就扣几分,让你求出最少的扣分。
思路:
因为N比较小,所以可以枚举所有的情况,(1左移n) - 1代表n个1的二进制,我们用1来表示完成了该科目,0表示还没有完成该科目。我们从所有科目都没有完成的0开始枚举,然后1.2.3….(1左移n) - 1。对于该集合没有的科目,也就是二进制0的位置,添加该科目进去,更新最小的扣分。因为所有情况都枚举了,所以更新出来的最终结果就是最优结果
给你T组测试数据,每组测试数据给你一个N(1<=N<=15) 接下来有N行,每行分别代表需要做作业的科目,截止时间,完成需要花费的时间。如果不能在截止时间完成作业,那么考试分数就会被扣分,超出几天,就扣几分,让你求出最少的扣分。
思路:
因为N比较小,所以可以枚举所有的情况,(1左移n) - 1代表n个1的二进制,我们用1来表示完成了该科目,0表示还没有完成该科目。我们从所有科目都没有完成的0开始枚举,然后1.2.3….(1左移n) - 1。对于该集合没有的科目,也就是二进制0的位置,添加该科目进去,更新最小的扣分。因为所有情况都枚举了,所以更新出来的最终结果就是最优结果
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define mm (1 << 15) + 5 struct node { char s[105]; int D, C; }; node a[20]; int dp[mm], Pre[mm], n; void print(int u)//输出路径 { int cnt; if(u == 0) return; for(int i = 0; i < n; i++) { if( (u & (1 << i)) && !(Pre[u] & (1 << i)) )//这个集合里面有,上一个集合没有的 { cnt = i; break; } } print(Pre[u]); printf("%s\n", a[cnt].s);//回溯的时候输出,就可以从前往后输出了 } int main() { int T, i, j, k; scanf("%d", &T); while(T--) 4000 { scanf("%d", &n); for(i = 0; i < n; i++) { scanf("%s %d %d", a[i].s, &a[i].D, &a[i].C); } memset(dp, inf, sizeof(dp));//初始化为无穷大 memset(Pre, 0, sizeof(Pre)); dp[0] = 0; for(i = 0; i < (1 << n) - 1; i++)//枚举所有情况 { for(j = 0; j < n; j++) { if(i & (1 << j)) continue;//该科目已经在i集合里面了,继续查找 //找到没有在i集合里面的科目 int cnt = 0; for(k = 0; k < n; k++) if(i & (1 << k)) cnt += a[k].C;//将所有已经在i集合里面的科目 的完成作业需要花费时间和求出 cnt += a[j].C;//添加j科目 if(cnt > a[j].D)//判断需要减少多少分 { cnt = cnt - a[j].D; } else cnt = 0;//不需要减分 if(dp[i|(1<<j)] > dp[i] + cnt)//更新,加了科目j后的值 { dp[i|(1<<j)] = dp[i] + cnt; Pre[i|(1<<j)] = i;//记录路径 } } } printf("%d\n", dp[(1<<n) - 1]); print((1<<n) - 1); } return 0; }
相关文章推荐
- hdu 1074 doing homework(状态压缩dp)
- HDU 1074 Doing Homework(状态压缩 + DP)
- HDU 1074 Doing Homework【状态压缩DP】
- hdu 1074 Doing Homework (状态压缩dp)
- HDU 1074 Doing Homework【状态压缩DP】
- hdu 1074 Doing Homework (状态压缩 dp)
- HDU 1074 Doing Homework【状态压缩DP】
- Hdu 1074 Doing Homework 状态压缩DP
- hdu 1074 Doing Homework 状态压缩dp
- HDU 1074 Doing Homework(状态压缩dp)
- hdu 1074 Doing Homework 状态压缩的DP
- HDU1074 Doing Homework(状态压缩DP)
- hdu-1074 Doing Homework(状态压缩DP)
- hdu1074 Doing Homework (状态压缩dp)
- HDU 1074 Doing Homework(DP状态压缩)
- HDU 1074 Doing Homework(状态压缩DP)
- HDU1074 Doing Homework 状态压缩dp
- HDU 1074 Doing Homework (二进制状态压缩,状压dp)
- HDU 1074 Doing Homework(DP·状态压缩)
- HDU 1074 Doing Homework(状态压缩dp)