首页 > 其他分享 >杭电2602---01背包

杭电2602---01背包

时间:2023-02-06 21:03:01浏览次数:65  
标签:--- 01 10 int scanf back 杭电 1009 include


骨收集器

​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背包的思想参看:​​javascript:void(0)​​

代码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
14


5
5 10
1 2 3 4 5
0 0 0 0 0

5 10
1 2 3 4 5
0 0 1 0 0

5 0
1 2 3 4 5
0 0 1 0 0

5 3
1 2 3 4 5
0 0 1 2 3



5 10
1 2 3 4 5 价值
5 5 5 5 5 体积

3 5
6 5 4
1 5 4


3 5
2 3 3
1 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];
}


标签:---,01,10,int,scanf,back,杭电,1009,include
From: https://blog.51cto.com/u_15955675/6040508

相关文章

  • 杭电1248-背包
    院大学生程序设计竞赛(新生为主)寒冰王座TimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):13570AcceptedSubm......
  • 杭电1201
    18岁生日ProblemDescriptionGardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都......
  • UVA227--谜题
    #include<iostream>#include<cstdio>usingnamespacestd;intmain(){chara[5][7],t;intn,m,i,j,k;intcases=0;charmodol[1001];while(gets(......
  • 杭电1202--学分
    ThecalculationofGPATimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):24013AcceptedSubmission(s):5610P......
  • 杭电1205--吃糖
    吃糖果ProblemDescriptionHOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可......
  • 南阳理工--103背包问题
    背包问题难度:3描述现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就......
  • 杭电1163--9余项定理的例子
    #include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;intmain(){intn,a[10009];inti,t;while(scanf("%d",&n),n!=0){......
  • RCU-1——内核文档翻译——RCU-tasks
    一、TheRCU-taskssubsystem:https://lwn.net/Articles/607117/翻译读取-复制-更新(RCU)机制负责保留旧版本的数据结构,直到它知道没有CPU可以保存对它们的引用;一旦发生......
  • <<从Paxos到Zookeeper-分布式一致性原理与实践>>
    <<从Paxos到Zookeeper-分布式一致性原理与实践>>1分布式特点分布性对等性并发性缺乏全局时钟故障总会发生2分布式问题通信异常网络分区三态单体应用中一次......
  • javaScript - 数组的创建方式,数组的属性,数组的常用方法,数组的全部方法
    1.数组的创建方式//方式1vararray=newArray();array[0]="levi"//方式2vararray=newArray("png","jpg");//方式3vararray=["levi","mikasa"] 2.数组的属......