标签:
4 5 2 3 1 2 3 4 2 2
7
思路:由于重量太大不可能开重量的数组,所以我们可以这样考虑,求当前价值下的最小重量,这样的话问题就简单解决了;
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int MAX = 0x3fffffff; 7 const int N = 1e4+10; 8 struct T 9 { 10 int wi,vi; 11 }ma[110]; 12 long long dp[N]; 13 int main() 14 { 15 int n , W, M; 16 while(scanf("%d %d",&n,&W) !=EOF) 17 { 18 M = 0; 19 fill(dp,dp+N,MAX); 20 for(int i = 1;i<=n ; i++) 21 { 22 scanf("%d%d",&ma[i].wi,&ma[i].vi); 23 M = ma[i].vi + M; 24 } 25 dp[0] = 0; 26 //常用的01背包 27 for(int i = 1; i<=n; i++) 28 for(int j = M; j>=ma[i].vi; j--) 29 { 30 dp[j] = min(dp[j],dp[j-ma[i].vi]+ma[i].wi); 31 } 32 int ans = 0; 33 for(int i = M; i>=0; i--) 34 { 35 if(dp[i]<=W) {ans = i;break;}//从最大的价值开始遍历,最大价值不会超过1w 36 } 37 printf("%d\n",ans); 38 } 39 return 0; 40 }
标签:
原文地址:http://www.cnblogs.com/lovychen/p/4424016.html