题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2159
思路
每种怪都有无限个,所以使用完全背包来解决。这题比普通完全背包多了一个条件,就是杀怪的个数不应超过k个,所以要另开一个数组cnt[],cnt[i]表示在忍耐度为i的情况下,获得最大经验所杀怪的数目。
代码
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int N = 110; 8 int cost[N], value[N]; 9 int dp[N]; 10 int cnt[N]; 11 12 int main() 13 { 14 //freopen("hdoj2159.txt", "r", stdin); 15 int n, m, k, s; 16 while (cin >> n >> m >> k >> s) 17 { 18 for (int i = 0; i < k; i++) 19 cin >> value[i] >> cost[i]; 20 21 memset(dp, 0, sizeof(dp)); 22 memset(cnt, 0, sizeof(cnt)); 23 for (int i = 0; i < k; i++) 24 { 25 for (int j = cost[i]; j <= m; j++) 26 { 27 if (dp[j] < dp[j - cost[i]] + value[i]) 28 { 29 dp[j] = dp[j - cost[i]] + value[i]; 30 cnt[j] = cnt[j - 1] + 1; 31 } 32 } 33 } 34 35 bool flag = false; 36 for (int i = 0; i <= m; i++) 37 { 38 if (dp[i] >= n && cnt[i] <= s) 39 { 40 flag = true; 41 cout << m - i << endl; 42 break; 43 } 44 } 45 if (!flag) cout << "-1" << endl; 46 } 47 return 0; 48 }