Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
1 5 10 1 2 3 4 5 5 4 3 2 1
14
有一个人喜欢收集各种骨头,要在往一个固定体积的背包里放骨头,每块骨头的价值和体积不同;
求背包里骨头价值的总和的最大值
思路:裸的01背包问题
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAX 1005
using namespace std;
long bag[MAX];
long val[MAX];
long w[MAX];
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(bag,0,sizeof(bag));
memset(val,0,sizeof(val));
memset(w,0,sizeof(w));
int n,m;
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;i++)//记录每块骨头的价值
scanf("%ld",&val[i]);
for(i=1;i<=n;i++)//记录每块骨头的体积
scanf("%ld",&w[i]);
int j;
for(i=1;i<=n;i++){ //背包算法核心
for(j=m;j>=0;j--){
if(w[i]<=j){
bag[j]=max(bag[j],bag[j-w[i]]+val[i]);
}
}
}
printf("%ld\n",bag[m]);
}
return 0;
}