题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2159
碎念:
动态规划先疯狂刷题一段时间吧,暂时有点混乱。
代码:
#include<stdio.h>
#include<string>
int dp[101][101];//dp[j][l]表示消耗j耐久和杀l个怪所得经验的最大值。
int value[101],expend[101];
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int main()
{
int n,m,k,s;//n:还需经验 m:耐久 k:k种怪物 s:可杀s个怪
while(~scanf("%d%d%d%d",&n,&m,&k,&s))
{
int i;
for(i=1;i<=k;i++)
{
scanf("%d%d",&value[i],&expend[i]);
}
memset(dp,0,sizeof(dp));
int j,l;
for(i=1;i<=k;i++)
{
for(j=expend[i];j<=m;j++)
{
for(l=1;l<=s;l++)
{
dp[j][l]=max(dp[j][l],dp[j-expend[i]][l-1]+value[i]);
}
}
}
int ans=m+1;
int flag=0;
for(j=0;j<=m;j++)
{
if(flag) break;
for(l=0;l<=s;l++)
{
if(dp[j][l]>=n)
{
ans=j;
flag=1;
break;
}
}
}
printf("%d\n",m-ans);
}
return 0;
}