杭电2602---01背包
来源:互联网 发布:软件天空破解版 编辑:程序博客网 时间:2024/05/21 22:25
骨收集器
http://acm.hdu.edu.cn/showproblem.php?pid=2602
问题描述
许多年前,在泰迪的家乡有一个叫“拾骨者”的人。这个人喜欢收集不同的骨头,比如狗,牛,他还去了坟墓…
骨收集器有一大袋的体积V,以及访问收集有很多骨头,很明显,不同的骨骼有不同的价值和不同的体积,现在考虑到每个骨头的价值以及他的旅行,你能计算出最大的总价值骨头收集器可以得到什么?
输入
第一行包含一整数T。
其次是T的情况下,每种情况下三行,第一行包含两个整数N,V,V(N < = 1000,< = 1000)代表骨骼的数量和他的包的体积。和第二行包含N个整数代表每个骨头的价值。第三行包含N个整数代表每个骨头的体积。
输出
每行一个整数代表最大的总价值(这个数字将低于231)。
样例输入
1
5 10
1 2 3 4 5
5 4 3 2 1
样例输出
14
01背包的思想参看:http://www.cnblogs.com/tanky_woo/archive/2010/07/31/1789621.html
代码1:
# include <iostream># include <cstdio># include <cstring># include <algorithm> using namespace std;int back(int *w,int *v,int n,int m);int f[1009][1009];//保存状态int main(){ int w[1009];//价值 int v[1009];//体积 int i,j,T,n,m;//n表示物品的个数,m表示背包的体积 while(scanf("%d",&T)!=EOF){ while(T--){ memset(w,0,sizeof(w)); memset(v,0,sizeof(v)); scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ scanf("%d",&w[i]); } for(i=1;i<=n;i++){ scanf("%d",&v[i]); } int max = back(w,v,n,m); printf("%d\n",max); } } return 0;}int back(int *w,int *v,int n,int m){ memset(f,0,sizeof(f)); int i,j; for(i=1;i<=n;i++){//这里不能从0开始,式子里面有i-1所以从1开始 for(j=0;j<=min(v[i]-1,m);j++) f[i][j]=f[i-1][j]; for(j=v[i];j<=m;j++){//这里不能从0开始,因为j-v[i],所以要从v[i]开始 f[i][j] = max(f[i-1][j],f[i-1][j-v[i]]+w[i]); //(f[i-1][j]>f[i-1][j-v[i]]+w[i])?f[i-1][j]:(f[i-1][j-v[i]]+w[i]); // cout<<"f["<<i<<"]["<<j<<"]="<<f[i][j]<<" "; } // cout<<endl; } /* 一件件东西放进去,对同一件东西,考虑每个总体积,考虑这个东西放不放,取放和不放之间的最大值 */ return f[n][m]; return 0;}/* 1 5 10 1 2 3 4 5 5 4 3 2 1 f[1][5]=1 f[1][6]=1 f[1][7]=1 f[1][8]=1 f[1][9]=1 f[1][10]=1 f[2][4]=2 f[2][5]=2 f[2][6]=2 f[2][7]=2 f[2][8]=2 f[2][9]=3 f[2][10]=3 f[3][3]=3 f[3][4]=3 f[3][5]=3 f[3][6]=3 f[3][7]=5 f[3][8]=5 f[3][9]=5 f[3][10]=5 f[4][2]=4 f[4][3]=4 f[4][4]=4 f[4][5]=7 f[4][6]=7 f[4][7]=7 f[4][8]=7 f[4][9]=9 f[4][10]=9 f[5][1]=5 f[5][2]=5 f[5][3]=9 f[5][4]=9 f[5][5]=9 f[5][6]=12 f[5][7]=12 f[5][8]=12 f[5][9]=12 f[5][10]=14 1455 101 2 3 4 50 0 0 0 05 101 2 3 4 50 0 1 0 05 01 2 3 4 50 0 1 0 05 31 2 3 4 50 0 1 2 35 101 2 3 4 5 价值 5 5 5 5 5 体积 3 56 5 41 5 43 5 2 3 31 8 9*/
代码2:
# include <iostream># include <cstdio># include <algorithm># include <cstring> using namespace std;int back(int w[],int v[],int n,int m);int f[1009];int main(){ int n,m,T; int i,j,k; int v[1009];//v代表大小 int w[1009];//w代表价值 while(scanf("%d",&T)!=EOF){ while(T--){ scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",&w[i]); for(i=1;i<=n;i++) scanf("%d",&v[i]); int max_ = back(w,v,n,m); printf("%d\n",max_); } } return 0;}int back(int w[],int v[],int n,int m){ memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) for(int j=m;j>=v[i];j--)//不能写成 ,注意下标 for(int j=m;j>=0;j--) f[j] = max(f[j],f[j-v[i]]+w[i]);//上一层的f[j]与 f[j-v[i]]+w[i]比较 return f[m];}
0 0
- 杭电 2602 01 背包
- 杭电2602---01背包
- 【杭电2602】01背包
- 01背包基础 (杭电2602)
- 杭电1494---01背包。
- ACM 杭电hdu 2602 Bone Collector(01背包)
- 杭电2602--Bone Collector(01背包…
- Bone Collector(杭电2602)(01背包)
- 杭电 2602 bone collector (01背包)
- 杭电2602Bone Collector(01背包)
- 【杭电oj】2602 - Bone Collector(01背包)
- 杭电OJ 2602 典型01背包问题
- 杭电2602 Bone Collector(01背包)
- 杭电-2602 Bone Collector(01背包模板)
- 杭电2602(01背包问题)——第一次做背包问题的理解
- HDU--杭电--2602--Bone Collector--背包
- 杭电ACM 2602 Bone Collector背包
- 杭电1171(01背包+完全背包)
- 1、运行spark示例工程前期准备SparkExampleWorkSpace(1)
- 网页游戏研发巨头墨麟集团为什么会衰败的这么快?
- ThinkPHP中数据库CRUD操作方法盘点(field方法)
- java学习:创建鼠标监听事件
- java线程中异常的处理 -Java 7 Concurrency Cookbook 读书笔记
- 杭电2602---01背包
- Linux 用户身份切换
- 【LeetCode从零单刷】H-index I & II
- InvocationTargetException异常
- 从零开始学【树】
- 原码、反码、补码之加减运算
- hdu 5510 Bazinga 2015ACM/ICPC亚洲区沈阳站现场赛
- Memcached介绍
- 03-32位UUID和封装Map对象到指定类型的Bean中