您的位置:首页 > 其它

hdoj2159 FATE(完全背包)

2017-12-10 15:44 281 查看

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2159

思路

每种怪都有无限个,所以使用完全背包来解决。这题比普通完全背包多了一个条件,就是杀怪的个数不应超过k个,所以要另开一个数组cnt[],cnt[i]表示在忍耐度为i的情况下,获得最大经验所杀怪的数目。

代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int N = 110;
int cost
, value
;
int dp
;
int cnt
;

int main()
{
//freopen("hdoj2159.txt", "r", stdin);
int n, m, k, s;
while (cin >> n >> m >> k >> s)
{
for (int i = 0; i < k; i++)
cin >> value[i] >> cost[i];

memset(dp, 0, sizeof(dp));
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < k; i++)
{
for (int j = cost[i]; j <= m; j++)
{
if (dp[j] < dp[j - cost[i]] + value[i])
{
dp[j] = dp[j - cost[i]] + value[i];
cnt[j] = cnt[j - 1] + 1;
}
}
}

bool flag = false;
for (int i = 0; i <= m; i++)
{
if (dp[i] >= n && cnt[i] <= s)
{
flag = true;
cout << m - i << endl;
break;
}
}
if (!flag) cout << "-1" << endl;
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: