Bone Collector
Problem Description
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 ?
Input
The first line contain a integer T , the number of cases.
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.
Output
One integer per line representing the maximum of the total value (this number will be less than 231).
Sample Input:
1
5 10
1 2 3 4 5
5 4 3 2 1
Sample Output:
14
题目大意:
有n个物品,一个容量为v的背包。先输入n个物品的价值,再输入n个物品的体积。问这个背包最多能装多少价值的物品?
解题思路:
01背包模板题,具体看代码好好理解。初始化方面如果题目问的是“恰好装满背包”时的最优解,那么f [0] 为0,其他 f [1…V]设置为负无穷。如果没有要求把背包全部装满,则和本题一样将 f [0…V]全部设置为0。
AC代码
#include <bits/stdc++.h>
using namespace std;
#define max(a, b) ((a) > (b) ? (a) : (b))
#define INF 0x3f3f3f3f
const int NINF = -(unsigned(-1)>>1)-1;
typedef long long ll;
const int maxn = 1005;
int f[maxn],c[maxn],w[maxn];
int main(int argc, char **argv){
int t,n,v;
while(~scanf("%d",&t)){
while(t--){
fill(f, f+maxn, 0);
scanf("%d%d",&n,&v);
for(int i=1; i<=n; i++){
scanf("%d",&w[i]);
}
for(int i=1; i<=n; i++){
scanf("%d",&c[i]);
}
for(int i=1; i<=n; i++){
for(int j=v; j>=c[i]; j--){
f[j] = max(f[j], f[j-c[i]]+w[i]);
}
}
printf("%d\n",f[v]);
}
}
return 0;
}