主题链接:
状态转移方程:
dp[ren][num] =max(dp[ren-耐久值][num-1]+ 经验值,dp[ren][num])
dp表示:当前忍耐度ren下杀敌数为num的经验值
枚举分别枚举 全部怪物种类、耐久度、杀怪数
最后在从小到达枚举消耗的耐久度就可以
#include#include #include #include #include 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\n",ans); break; } } if(ans ==-1) printf("%d\n",ans); } return 0;}
版权声明:本文博主原创文章,博客,未经同意不得转载。