您的位置:首页 > 其它

HDU 2159 FATE 【二维费用的完全背包问题】

2013-08-03 09:54 274 查看
思路:

要注意:最后结果输出时要查找当经验值等于或者大于n时的最小忍耐值m,方可满足最大的保留忍耐值

AC代码:

#include<stdio.h>
#include<string.h>
int dp[100][100],a[100],b[100];
int M,S;
void CompletePack(int c,int w)
{
int m,s;
for(m=c;m<=M;m++)
for(s=1;s<=S;s++)
if(dp[m][s]<dp[m-c][s-1]+w)
dp[m][s]=dp[m-c][s-1]+w;
}
int main()
{
int n,k;
int i;
int max;
int m,s;
int t;
while(scanf("%d%d%d%d",&n,&M,&k,&S)!=-1)
{
for(i=1;i<=k;i++)
scanf("%d%d",&a[i],&b[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=k;i++)
CompletePack(b[i],a[i]);
if(dp[M][S]<n)printf("-1\n");
else
{
for(m=0;m<=M;m++)
{
t=0;
for(s=0;s<=S;s++)
if(dp[m][s]>=n)
{
t=1;
max=m;
break;
}
if(t)break;
}
printf("%d\n",M-max);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: