hdu 2159 二维费用完全背包

//题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2159
//题意:中文题,不解释
//2维费用背包问题
//解题思路:题目要求升完级后还能保留的最大忍耐度,转换为求,总忍耐度 - 升完这级需要的最小忍耐度
//f[i][u][v] 杀死前i种怪物达到经验值为u并且是v只怪物的最小忍耐度。
//f[i][u][v] = min(f[i][u][v],f[i][u-jinyan[i]][v-1]+rennai[i])

 

#include <iostream> using namespace std; const int INF = 0x3fffffff; const int MAXN = 200+10; int f[MAXN+20][MAXN]; int jinyan[MAXN]; //经验值 int rennai[MAXN]; //忍耐度 int min(int a, int b) { return a < b ? a : b; } int main() { int n,m,k,s; int i,j,u,v; int MIN; while(cin>>n>>m>>k>>s) { MIN = INF; for(i=1; i<=k; i++) { cin>>jinyan[i]>>rennai[i]; } //初始化 for(i=0; i<=125; i++) { for(j=0; j<=110; j++) { f[i][j] = INF; } } f[0][0] = 0; for(i=1; i<=k; i++) { for(u=jinyan[i]; u<=120; u++) { for(v=1; v<=s; v++) { f[u][v] = min(f[u][v],f[u-jinyan[i]][v-1]+rennai[i]); if(u >= n && f[u][v] < MIN) //如果经验值达到,并且需要的最小忍耐度小于MIN { MIN = f[u][v]; } } } } if(MIN > m) { cout<<"-1"<<endl; } else { cout<<m-MIN<<endl; } } return 0; }

你可能感兴趣的:(hdu 2159 二维费用完全背包)