您的位置:首页 > 其它

hdu 2159 二维费用完全背包

2011-04-29 01:43 302 查看
//题目链接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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: