主题链接:FATE
状态转移方程:
dp[ren][num] =max(dp[ren-耐久值][num-1]+ 经验值,dp[ren][num])
dp表示:当前忍耐度ren下杀敌数为num的经验值
枚举分别枚举 全部怪物种类、耐久度、杀怪数
最后在从小到达枚举消耗的耐久度就可以
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> const int INF = 1e7; using namespace std; int dp[105][105],cost[600][2]; int max(int x,int y) { if(x > y) return x; else return y; } int min(int x,int y) { if(x > y) return y; else return x; } int main() { int n,m,k,s; while(~scanf("%d%d%d%d",&n,&m,&k,&s)) { for(int i = 1;i<=k;i++) { scanf("%d%d",&cost[i][0],&cost[i][1]); } memset(dp,0,sizeof(dp)); int i,ren,num,ans = -1; for( i = 1;i<=k;i++) { for( ren = cost[i][1];ren<=m;ren++) { for( num = 1;num<=s;num++) { if(dp[ren][num] < dp[ren-cost[i][1]][num-1]+ cost[i][0]) dp[ren][num] = dp[ren-cost[i][1]][num-1] + cost[i][0]; } } } for(int i = 1;i<=m;i++) { if(dp[i][s] >=n) { ans = m - i; printf("%d ",ans); break; } } if(ans ==-1) printf("%d ",ans); } return 0; }
版权声明:本文博主原创文章,博客,未经同意不得转载。