hdu2602-01背包

Bone Collector

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23108    Accepted Submission(s): 9379


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
 
 
二维数组
 1 #include <iostream>
 2 #include <cstring>
 3 #define maxn 1005
 4 using namespace std;
 5 int n,c[maxn],v[maxn],ans[maxn][maxn],T,V;
 6 
 7 int main()
 8 {
 9     cin>>T;
10     while(T--){
11         cin>>n>>V;
12         for(int i=1; i<=n; i++)
13             cin>>v[i];
14         for(int i=1; i<=n; i++)
15             cin>>c[i];
16         memset(ans,0,sizeof(ans));
17         for(int i=1; i<=n; i++)
18             for(int j=0; j<=V; j++){   //j要从0开始,从1开始会Wa,目前还不是很理解这点
19                 if(j<c[i]) 
20                     ans[i][j]=ans[i-1][j];
21                 else 
22                     ans[i][j]=max(ans[i-1][j], ans[i-1][j-c[i]]+v[i]);
23             }
24         cout<<ans[n][V]<<endl;
25     }
26     return 0;
27 }

 

一维数组

 1 #include <iostream>
 2 #include <cstring>
 3 #define maxn 1005
 4 using namespace std;
 5 
 6 int N,V,ans[maxn],c[maxn],w[maxn];
 7 
 8 void ZeroOnePack(int c, int w)
 9 {
10     for(int i=V; i>=c; i--)
11         ans[i]=max(w+ans[i-c],ans[i]);
12 }
13 int main()
14 {
15     int T;
16     cin>>T;
17     while(T--){
18         cin>>N>>V;
19         memset(ans,0,sizeof(ans));
20         for(int i=1; i<=N; i++)
21             cin>>w[i];
22         for(int i=1; i<=N; i++)
23             cin>>c[i];
24         for(int i=1; i<=N; i++)
25             ZeroOnePack(c[i],w[i]);
26         cout<<ans[V]<<endl;
27     }
28     return 0;
29 }

 

posted on 2013-12-01 19:27  chennmx  阅读(258)  评论(1编辑  收藏  举报

导航