题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159
题意:有n种怪物,杀掉每种怪物减少一定的忍耐值,增加一定的经验值,经验值超过n才能晋级,忍耐度不超过m,最多杀死s只怪物,问晋级剩下的忍耐度最大值为多少,不能晋级输出-1
分析:二维背包+完全背包,二维费用背包的两种费用分别为杀死的怪物数和忍耐度ti,dp[i][j]表示杀死j只怪物剩下i忍耐度的最大经验值,可以得到dp[ i ][ j ] = max(dp[ i ][ j ], dp[i - t[i]][j - 1])
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 110;
int v[maxn],t[maxn];
int dp[maxn][maxn];
int main()
{
int n,m,k,s;
while(~scanf("%d%d%d%d",&n,&m,&k,&s))
{
memset(v,0,sizeof(v));
memset(dp,0,sizeof(dp));
for(int i = 1; i <= k; i++)
scanf("%d%d",&v[i],&t[i]);
for(int i = 1; i <= k; i++)
{
for(int j = t[i]; j <= m; j++)
{
for(int l = 1; l <= s; l++)
dp[j][l] = max(dp[j][l],dp[j - t[i]][l - 1] + v[i]);
}
}
int flag = 0;
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= s; j++)
{
if(dp[i][j] >= n)
{
cout<<m - i<<endl;
flag = 1;
break;
}
}
if(flag)
break;
}
if(!flag)
printf("-1\n");
}
return 0;
}