hdoj2159 FATE(完全背包)

题目链接

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 }
原文地址:https://www.cnblogs.com/sench/p/8017087.html