原题代号:HDU 2602
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
原题描述:
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
题目大意:骨头收集者在收集骨头,有容量为v的袋子,n个骨头,给出每个骨头的价值和体积。问最大能收集的价值是多少。(01背包问题)
解法一:时间,空间复杂度均为O(n2)
# include <stdio.h> # include <string.h> # include <stdlib.h> # include <iostream> # include <fstream> # include <vector> # include <queue> # include <stack> # include <map> # include <math.h> # include <algorithm> using namespace std; # define pi acos(-1.0) # define mem(a,b) memset(a,b,sizeof(a)) # define FOR(i,a,n) for(int i=a; i<=n; ++i) # define For(i,n,a) for(int i=n; i>=a; --i) # define FO(i,a,n) for(int i=a; i<n; ++i) # define Fo(i,n,a) for(int i=n; i>a ;--i) typedef long long LL; typedef unsigned long long ULL; int a[1000+5],b[1000+5],dp[1000+5][1000+5]; int main() { int t,n,v; cin>>t; while(t--) { cin>>n>>v; FOR(i,1,n)cin>>b[i]; FOR(i,1,n)cin>>a[i]; mem(dp,0); FOR(i,1,n)FOR(j,0,v) { if(a[i]<=j)dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+b[i]); else dp[i][j]=dp[i-1][j]; } cout<<dp[n][v]<<endl; } return 0; }
解法二:时间复杂度O(n2),空间复杂度O(n)
# include <stdio.h> # include <string.h> # include <stdlib.h> # include <iostream> # include <fstream> # include <vector> # include <queue> # include <stack> # include <map> # include <math.h> # include <algorithm> using namespace std; # define pi acos(-1.0) # define mem(a,b) memset(a,b,sizeof(a)) # define FOR(i,a,n) for(int i=a; i<=n; ++i) # define For(i,n,a) for(int i=n; i>=a; --i) # define FO(i,a,n) for(int i=a; i<n; ++i) # define Fo(i,n,a) for(int i=n; i>a ;--i) typedef long long LL; typedef unsigned long long ULL; int a[1000+5],b[1000+5],dp[1000+5]; int main() { int t,n,v; cin>>t; while(t--) { int ans=0; cin>>n>>v; FOR(i,1,n)cin>>b[i]; FOR(i,1,n)cin>>a[i]; mem(dp,0); FOR(i,1,n)For(j,v,0) { if(a[i]<=j)dp[j]=max(dp[j],dp[j-a[i]]+b[i]); } cout<<dp[v]<<endl; } return 0; }