标签:
1 /*二维完全背包问题......*/ 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 int main() 8 { 9 int n,m,k,s; 10 int dp[105][105]; 11 while(cin>>n>>m>>k>>s) 12 { 13 memset(dp,0,sizeof(dp)); 14 for(int i = 0; i < k; i++) //第几个怪物 15 { 16 int a,b; 17 cin>>a>>b; 18 for(int j = 1; j <= s; j++) //怪物的个数 19 { 20 for(int t = b; t <= m; t++) //剩余的忍耐度 21 { 22 /*dp[最多杀怪数目] [消耗掉的忍耐度] = 经验*/ 23 dp[j][t] = max(dp[j][t],dp[j-1][t-b]+a); 24 } 25 } 26 } 27 /*最大的价值也达不到所需的经验值 28 *其他的也肯定达不到 29 *此时就应该输出-1 30 */ 31 if(dp[s][m]<n) 32 cout<<"-1"<<endl; 33 else 34 { 35 int ans = m; 36 for(int i = 1; i <= s; i++) 37 for(int j = 1; j <= m; j++) 38 { 39 //找出达到所需经验值时消耗最少的忍耐度 40 if(dp[i][j] >= n && j <= ans) 41 ans = j; 42 } 43 cout<<m-ans<<endl; 44 } 45 } 46 return 0; 47 }
标签:
原文地址:http://www.cnblogs.com/cjshuang/p/4662582.html