思路:题目中要求有最大杀怪数,那么也就是变成了二维费用问题,我们就可以将状态转移方程写成这样dp[j][k] = max(dp[j][k],dp[j-c[i]][k-1]+w[i])。
然后我们顺序遍历整个数组,找出能升级的消耗最少的那个耐久度,这样就能求出最大剩余的耐久度了。。
附上代码:
#include<iostream>
#include<cstring>
int dp[110][110];
int w[110];
int c[110];
int a[110];
using namespace std;
int main ()
{
int need,v1,n,v2;
while(cin >> need >> v1 >> n >> v2 && need && n && v2)
{
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i++)
cin >> w[i] >> c[i];
for(int i = 1;i <= n;i++)
{
for(int j = c[i];j <= v1;j++)
{
for(int k = 1;k <= v2;k++)
dp[j][k] = max(dp[j][k],dp[j-c[i]][k-1]+w[i]);
}
}
int j,k;
int flag = 0;
for(j = 0;j <= v1;j++)
for(k = 0;k <= v2;k++)
{
if(dp[j][k] >= need)
{
flag = 1;
goto out;
}
}
out:
if(flag)
cout << v1 - j << endl;
else
cout << -1 << endl;
}
return 0;
}