Bone Collector(0-1揹包)
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 2 31).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
#include<iostream> #include<cmath> #include<string.h> #include<algorithm> #include<cstdio> #include<queue> #include<set> #include<map> #include<vector> #include<string> using namespace std; typedef long long ll; const int maxn = 10010; const int maxv = 10010; ll w[maxn],c[maxn],dp[maxv]; int main(){ int t; cin>>t; while(t--) { memset(w,0,sizeof(w)); memset(c,0,sizeof(c)); memset(dp,0,sizeof(dp)); int n,V; cin>>n>>V; for(int i = 1; i <= n; i++) { cin>>c[i];//價值 } for(int i = 1; i <= n ;i++) { cin>>w[i];//重量 } //邊界 for(int v = 0; v <=V; v++) { dp[v] = 0; } for(int i = 1; i <=n; i++) { for(int v=V; v>=w[i];v--){ dp[v] = max(dp[v],dp[v-w[i]]+c[i]); } } ll res = 0; for(int v = 0;v<=V;v++) { if(res<dp[v]){ res = dp[v]; } } cout<<res<<endl; } }