百度之星资格赛1004 01背包+记录路径套路
来源:互联网 发布:剑灵人物数据 编辑:程序博客网 时间:2024/06/07 03:19
题目链接
/*百度之星资格赛100401背包套路题.这个题目是一个01背包+记录路径的题目.关于记录路径的套路题,一般开一个book标记一下,book[i][j]表示容量为j时放入了第i个物品.由于我们从前往后将物品装入背包并维护最大值,所以我们看背包中装入哪些物品时从后往前,因为前面的物品已经有一个价值了,如果后面的物品能放进去那么一定是使答案变得更优了,那么我们就从后往前遍历放入的物品,然后将它的价值减去一直往前,直到价值变为0.但是这个题目是存在价值为0的东西的,是一个坑点.!!!! 判断字典序最小的时候,我就是直接把所有放进的物品取出来,排个序然后比较字典序就好 */#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm>#define inf 0x7f7f7f7fusing namespace std;typedef long long ll;const int maxn = 1e3+10;int m,n;ll s[maxn],c[maxn],dp[maxn];int book[maxn][maxn];int num[maxn][maxn];int cmp(int x,int y){ for(int i=1,j=1;i<=num[x][0]&&j<=num[y][0];i++,j++) { if(num[x][i]!=num[y][j]) return num[x][i]-num[y][j]; } return 0;}int main(){ int t; cin>>t; int ca =1; while(t--) { memset(dp,0,sizeof (dp)); memset(book,0,sizeof (book)); memset(num,0,sizeof (book)); scanf("%d%d",&m,&n); for(int i = 1;i <= n;i++) scanf("%lld%lld",&s[i],&c[i]); for(int i=1;i<=n;i++) { for(int j=m;j>=c[i];j--) { if(dp[j]<dp[j-c[i]]+s[i]) { dp[j]=dp[j-c[i]]+s[i]; book[i][j]=1; } } } ll index=inf; ll maxx=0; int cnt=0,item=0; for(int i=0;i<=m;i++) maxx=max(dp[i],maxx); for(int i=m;i>=0;i--) { if(dp[i]==maxx) { ll sum=0; int k=1; int j=n,w=i; while(j>=1&&w>=0) { if(book[j][w]) { num[cnt][k++]=j; sum+=j; w-=c[j]; } j--; } num[cnt][0]=k-1; sort(num[cnt]+1,num[cnt]+1+num[cnt][0]); if(index>sum) { index=sum; item=cnt; } else if(index==sum&&cmp(item,cnt)>0) { item=cnt; } cnt++; } } ll money=0,score=0; for(int i=1;i<=num[item][0];i++) { int w=num[item][i]; money+=c[w]; score+=s[w]; } printf("Case #%d:\n",ca++); printf("%lld %lld\n",score,money); for(int i=1;i<=num[item][0];i++) printf("%d%c",num[item][i],i==num[item][0]?'\n':' '); } return 0;}
阅读全文
0 0
- 百度之星资格赛1004 01背包+记录路径套路
- hdu6083 2017"百度之星"资格赛1004 度度熊的午饭时光(背包dp+记录路径)
- 2017百度之星资格赛:1004. 度度熊的午饭时光(01背包+记录路径)
- 2017百度之星资格赛 hdu6083 度度熊的午饭时光 (01背包+字典序路径)
- 百度之星资格赛1003 完全背包
- 2017百度之星资格赛 1002-图 1003-DP 1004-01背包(解选择方案)
- 2017百度之星资格赛 1004 度度熊的午饭时光(01背包)
- 2017百度之星资格赛1003(完全背包)
- 【2017百度之星资格赛 1003】hdu 6082 完全背包
- 百度之星资格赛
- 2014百度之星资格赛1004
- 百度之星资格赛 1004 Labyrinth
- 2015百度之星资格赛1004
- 2015百度之星资格赛1004
- 百度之星2016资格赛 1004
- 2016百度之星资格赛1001-1004
- 2014百度之星资格赛
- 百度之星资格赛1001
- Android 一个TextView中设置文字不同字体大小和颜色的最完整方法
- PAT 1046 划拳
- 百度之星资格赛1003 完全背包
- 百度之星1003度度熊与邪恶大魔王
- Python文本挖掘:词云图
- 百度之星资格赛1004 01背包+记录路径套路
- Delphi程序点与面的结合应用你不能错过这次交集的机会
- 前端js+后端php进行图片压缩上传(解决move_uploaded_file失败并附源码)
- 【Machine Learning】笔记:Adaptive learning rates
- LeetCode 312. Burst Balloons(戳气球)
- 登录账号参数化
- 机器学习1:统计基础之概率论
- 10042---Java面试题:Servlet是线程安全的吗?
- JavaScript:语法