标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 35815 Accepted Submission(s): 14753
题目大意:
就是说,给你一个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 }
代码:
标签:
原文地址:http://www.cnblogs.com/wikioibai/p/4429323.html