Bone Collector
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 35815 Accepted Submission(s): 14753
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 2
31).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
Author
Teddy
Source
Recommend
lcy | We have carefully selected several similar problems for you:
1203
2159
2955
1171
2191
题目大意:
就是说,给你一个N和V和N个物品的v[i]和w[i],让你求出,并且每次向背包中放入一个物品,让你求出最多能放多少个物品(物品的体积<=V)所能带来的最大的价值。
解题思路:
直接走0-1背包的模型:
定义状态:dp[i+1][j]表示,从前i个物品中选出来总重不超过j的物品所能带来的最大价值.
初始状态:dp[0][j]==0.
状态转移方程: dp[i+1][j] = dp[i][j] ,当j < w[i]时。
dp[i+1][j] = max ( dp[i][j],dp[i][j-w[i]]+v[i]); 其他
1 # include<cstdio>
2 # include<iostream>
3
4 using namespace std;
5
6 const int MAX = 1000+4;
7
8 int dp[MAX][MAX];
9 int w[MAX];
10 int v[MAX];
11
12
13 int main(void)
14 {
15 int t;cin>>t;
16 while ( t-- )
17 {
18 int n,vv;
19 cin>>n>>vv;
20 for ( int i = 0;i < n;i++ )
21 {
22 cin>>v[i];
23 }
24 for ( int i = 0;i < n;i++ )
25 {
26 cin>>w[i];
27 }
28 for ( int i = 0;i < n;i++ )
29 {
30 for ( int j = 0;j <= vv;j++ )
31 {
32 dp[0][j] = 0;
33 if ( j < w[i] )
34 {
35 dp[i+1][j] = dp[i][j];
36 }
37 else
38 {
39 dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i] );
40 }
41 }
42 }
43 cout<<dp[n][vv]<<endl;
44 }
45
46
47 return 0;
48 }
代码: