hdu 1074 doing homework
2016-05-28 12:16
387 查看
思路:纪录每个状态的最小花费dp[i] 然后转移 转移的时候要用到位运算 用1<<j表示第j个课程的选择 i&(<span style="font-family: Arial, Helvetica, sans-serif;">1<<j)检测是否由dp[i-(</span><span style="font-family: Arial, Helvetica, sans-serif;">1<<j</span><span style="font-family: Arial, Helvetica, sans-serif;">)]转移而来 然后全部取最小的 ,但是这个地方的转移顺序很需要注意! 选择j的时候要n-1 to 0 因为要用字典序最小的状态转移而来 所以字典序排序应该是j越大 之前的状态字典序越小 </span>
#include <iostream>#include <string>#include <cstring>#include <stack>#include <algorithm>using namespace std;const int inf = 1<<30;struct node{string name;int dead,cost;} a[50];struct kode{int time,score,pre,now;} dp[1<<15];int main(){int t,i,j,s,n,end;cin >> t;while(t--){memset(dp,0,sizeof(dp));cin >> n;for(i = 0; i<n; i++)cin >> a[i].name >> a[i].dead >> a[i].cost;end = 1<<n;for(s = 1; s<end; s++){dp[s].score = inf;for(i = n-1; i>=0; i--) // 此处转移应该注意顺序 n-1 to 0<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
{int tem = 1<<i;if(s & tem){int past = s-tem;int st = dp[past].time+a[i].cost-a[i].dead;if(st<0)st = 0;if(st+dp[past].score<dp[s].score){dp[s].score = st+dp[past].score;dp[s].now = i;dp[s].pre = past;dp[s].time = dp[past].time+a[i].cost;}}}}stack<int> S;int tem = end-1;cout << dp[tem].score << endl;while(tem){S.push(dp[tem].now);tem = dp[tem].pre;}while(!S.empty()){cout << a[S.top()].name << endl;S.pop();}}return 0;}
相关文章推荐
- CStdioFile类建立日志记录文件
- 2.1.4 uboot的工作方式
- 修改源码,自定义chromium启动页
- ie调试器
- 3611: [Heoi2014]大工程
- 勺子难免碰锅沿,不咬舌怎么读θ和ð?
- 2.1.3 uboot必须解决哪些问题?
- LeetCode:Count Primes
- Sublime Text 使用技巧
- ava包装类型的MAX_VALUE到底是多少啊
- Web服务器安全设置
- 2.1.2 93b6 为什么是uboot?
- shell 脚本(menu)
- php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
- C#中的访问修饰符
- 笔试题68. LeetCode OJ (55)
- Bridge(桥接)-对象结构型模式
- error inflating class binaryXML LayoutParams addRule()
- Android面试题大集结
- PowerShell 查询 Excel记录