1004 度度熊的午饭时光<01 背包>
来源:互联网 发布:淘宝评论完在哪里看 编辑:程序博客网 时间:2024/04/29 10:37
度度熊的午饭时光
Accepts: 544
Submissions: 7113
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
明显的01背包问题,只要注意下记录选取的顺序
有点小坑在于,题目的price可以取0,所以我们在选择时,背包的容量要是从0-B
以及最后输出的时候,没有最优选择策略时,注意最后的换行
#include <iostream>#include <cstring>#include <stack>#include <cstdio>#include <cmath>#include <queue>#include <algorithm>#include <vector>#include <set>#include <map>const double eps=1e-8;const double PI=acos(-1.0);using namespace std;struct food{ int score; int price;} f[1050];int m[1050][1050];//dpint select[1050][1050];//选择的存储int ans[1050];//路径存储int main(){ int t; scanf("%d",&t); int cas=1; while(t--) { memset(select,0,sizeof(select)); memset(ans,0,sizeof(ans)); memset(m,0,sizeof(m)); memset(f,0,sizeof(f)); int all; int n; scanf("%d%d",&all,&n); for(int i=1; i<=n; i++) scanf("%d%d",&f[i].score,&f[i].price); for(int i=1; i<=n; i++) { for(int j=0;j<=all;j++)//背包容量要从0-all(总容量). if(f[i].price<=j){ m[i][j]=max(m[i-1][j],m[i-1][j-f[i].price]+f[i].score); if(m[i][j]==m[i-1][j]) select[i][j]=0;//选取为1,反之为0; else select[i][j]=1; } else{ m[i][j]=m[i-1][j]; select[i][j]=0; } } int j=0; int all1=all; int cost=0; for(int i=n;i>=1;i--)//逆序得路径 if(select[i][all]==1){ ans[j++]=i; all-=f[i].price; cost+=f[i].price;//总花费 } printf("Case #%d:\n",cas++); printf("%d %d\n",m[n][all1],cost); if(j)//注意格式的输出 printf("%d",ans[j-1]); for(int i=j-2;i>=0;i--) printf(" %d",ans[i]); if(j) printf("\n"); } return 0;}
阅读全文
0 0
- 1004 度度熊的午饭时光<01 背包>
- 度度熊的午饭时光——01背包
- 01背包&&打印路径(hdu6083)度度熊的午饭时光
- 01背包+打印路径 hdu6083度度熊的午饭时光
- HDU 6083 度度熊的午饭时光(01背包)
- 2017百度之星资格赛 1004 度度熊的午饭时光(01背包)
- 度度熊的午饭时光
- 度度熊的午饭时光
- hdu6083 2017"百度之星"资格赛1004 度度熊的午饭时光(背包dp+记录路径)
- 2017百度之星资格赛:1004. 度度熊的午饭时光(01背包+记录路径)
- 2017百度之星资格赛 hdu6083 度度熊的午饭时光 (01背包+字典序路径)
- hdu 6083 度度熊的午饭时光(01背包+打印路径)
- HDU6083 度度熊的午饭时光
- “百度之星”资格赛 1004 度度熊的午饭时光
- 2017百度之星资格赛1004度度熊的午饭时光
- 度度熊的午饭时光[2017百度之星资格赛 1004]
- 百度之星1004度度熊的午饭时光
- 度度熊的午饭时光 百度之星
- SCU
- 存储优化
- 习题 4.8 给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为’E‘。
- JavaScript作用域
- java实现双向链表
- 1004 度度熊的午饭时光<01 背包>
- 杭电暑期多校集训—RXD and dividing
- C语言炫酷输出
- DevExpress Widget AutoSize
- brew cask install 解决慢的问题
- python学习之路-基础篇-day06
- 【简单枚举】HDU4858项目管理【BestCoder Round #1】
- Educational Codeforces Round 26 ABC题
- 笔试题 找到数组中,三个数乘积最大的结果