Bone Collector
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 ?
![](http://acm.hdu.edu.cn/data/images/C154-1003-1.jpg)
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 ?
![](http://acm.hdu.edu.cn/data/images/C154-1003-1.jpg)
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.
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
//最简单的背包问题,这是经过空间优化的代码
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int F[1005]; int w[1000+5],v[1000+5]; int dp(int N,int V) { for(int i = 1; i <= N;i++) { for(int j = V; j >= 0; j--) { if(j >= w[i]) F[j] = max(F[j],F[j - w[i]] + v[i]); } } int ans = 0;//记得初始化! for(int i = 0 ; i <= V;i++ ) ans = max(ans,F[i]); return ans; } int main() { int T; cin>>T; while(T) { int N,V; cin>>N>>V; memset(F,0,sizeof(F));//初始化 memset(w,0,sizeof(w)); memset(v,0,sizeof(v)); for(int i = 1; i <= N; i++) { cin>>v[i]; } for(int i = 1; i <= N;i++) { cin>>w[i]; } cout<<dp(N,V)<<endl; T--; } return 0; }