点击打开链接http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=251#problem/C
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 ?
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.
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题目描述:
有一个爱收集骨头(不良癖好)的家伙,他有一个背包,容积是V。现在有n块骨头,每块骨头有两个属性:体积volume和价值value。问他能够收集的骨头的价值之和最大是多少。
题面建模:
简单背包问题。
背包已用容积是j时,dp[j]=max(dp[j],dp[j-volumek]+valuek)。
转移方程:dp[j]=dp[j]>dp[j-bone[i][1]]+bone[i][0]?dp[j]:dp[j-bone[i][1]]+bone[i][0];
解题要点:
注意边界的处理。
时空开销分析:
空间复杂度:O(n)。
时间复杂度:O(n^2)。
#include<stdio.h> #include<string.h> int stone[1002][2]; int dp[1002]; int main() { int T,V,N,i,j; scanf("%d",&T); while(T--) { memset(stone,0,sizeof(stone)); memset(dp,0,sizeof(dp)); scanf("%d%d",&N,&V); for(i=0;i<N*2;i++) scanf("%d",stone[i%N]+i/N); for(i=0;i<N;i++) { for(j=V;j-stone[i][1]>=0;j--) { dp[j]=dp[j]>dp[j-stone[i][1]]+stone[i][0]?dp[j]:dp[j-stone[i][1]]+stone[i][0]; } } printf("%d\n",dp[V]); } return 0; }