您的位置:首页 > 其它

hdu 2159 FATE

2012-02-19 12:59 204 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2159

二维DP 并不是很难

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>

using namespace std;
struct node
{
int a,b;
}mem[101]; //a表示经验值 b 表示所需忍耐度
int n,m,k,s;

int ans[101][101];//ans[i][j]表示用i个忍耐度最多杀j个怪所能拿到的最多经验
int dp(int i,int j)
{
if(ans[i][j]!=-1)
return ans[i][j];
if(j==0||i==0)
{
ans[i][j]=0;
return ans[i][j];
}
ans[i][j]=0;
for(int l=1;l<=k;l++)
{
if(i-mem[l].b>=0)//只有忍耐度不为负的才能继续递归
{
ans[i][j]=max(ans[i][j],mem[l].a+dp(i-mem[l].b,j-1));
}
}
return ans[i][j];
}
int main()
{
int i,j;
int log;
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
for(i=1;i<=k;i++)
scanf("%d%d",&mem[i].a,&mem[i].b);

memset(ans,-1,sizeof(ans));
for(i=m;i>0;i--) //这里很重要 避免漏掉一些满足条件的情况
dp(i,s);
log=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=s;j++)
{
if(ans[i][j]>=n)
{
printf("%d\n",m-i);
log=1;
break;
}
}
if(log)
break;
}
if(!log)
{
printf("-1\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: