【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=2159
题目意思
你需要n点经验升级,有把忍耐度为m的武器,现在有k种怪物,每种怪物有无限只,你最多杀s只,问是否能够升级,如果能输出还可以杀多少只,如果不能输出-1.
解题思路
一个二维的完全背包题目。直接上代码
代码部分
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=105;
const int INF=0x3f3f3f;
int dp[maxn][maxn];
int a[maxn],b[maxn];
int main()
{
int n,m,s,k;
while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF)
{
memset(dp,0,sizeof(dp));
for (int i=1;i<=k;i++)
{
scanf("%d %d",&a[i],&b[i]);
}
for (int i=1;i<=k;i++) ///怪的种类
for (int j=b[i];j<=m;j++) ///消耗的忍耐(完全背包)
for (int z=1;z<=s;z++) ///打怪的数量 必须从1到s
dp[z][j]=max(dp[z][j],dp[z-1][j-b[i]]+a[i]);
if (dp[s][m]>=n)
{
for (int i=0;i<=m;i++)
{
if (dp[s][i]>=n)
{
printf("%d\n",m-i);
break;
}
}
}
else
{
printf("-1\n");
}
}
return 0;
}