最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗?
10 10 1 10 1 1 10 10 1 9 1 1 9 10 2 10 1 1 2 2
0 -1 1
这道题首先是要得到需要的经验值,然后要找花费忍耐度最小的情况,杀怪的数目也有限,所以就想到了dp,用dp[i][j]来表示在i忍耐度的情况下所积累的经验j,所以找杀怪数目最多时的最小i
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[101][101];//表示在消耗i个忍耐度,杀j个怪物得到的最大经验值,因为在不断的更新 struct node { int e;//经验值 int r;//忍耐度 }a[101]; int main() { int n,m,s,k,i,j,x; while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)//输入需要的经验值, //所剩的忍耐值, //k种怪,和最多杀怪数 { for(i=1;i<=k;i++) scanf("%d%d",&a[i].e,&a[i].r); memset(dp,0,sizeof(dp)); for(i=1;i<=k;i++) for(j=a[i].r;j<=m;j++) for(x=1;x<=s;x++) { dp[j][x]=max(dp[j][x],dp[j-a[i].r][x-1]+a[i].e);//求出需要找的各种忍耐值和杀的怪的数量的最大经验值经验值 } if(dp[m][s]>=n) //表示能过升级 { for(i=0;i<=m;++i) //寻找能够升级所消耗的最小忍耐度,只用找消耗相同忍耐度的情况下,令杀怪数量最多, if(dp[i][s]>=n) //那么d[i][s]一定是消耗i忍耐度的情况下,获得的最大经验值 { printf("%d\n",m-i); break; } } else printf("-1\n"); } return 0; }