HDU 2602 (0-1背包)

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 ?
HDU 2602 (0-1背包)
 

 

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
14
 

 

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 }

 

代码:

你可能感兴趣的:(HDU)