hdu 2159 FATE(完全背包第一弹) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159
题目分析:用背包的思想考虑此题,那么怪就是物品,杀掉它就是装入背包。与之前做的简单0-1背包不同的是,每种怪有无数个(完全背包)、限制条件(cost)有两个(杀怪数量上限s和忍耐度)。对于数量上的限制,我们把它刨出背包范围之外,建立一个计数数组count,在装包的同时顺便记下当前杀怪数,日后在dp数组里找答案时用到。剩下的就是普通完全背包了。
code:
#include<stdio.h>
#include<string.h>
int main()
{
//experience needed,endurence left
int i,j,n,v,c[110],p[110],dp[110],expn,endl,s,count[110];
while (scanf("%d%d%d%d",&expn,&endl,&n,&s)!=EOF)
{
for (i=0;i<n;i++)
{
scanf("%d%d",&p[i],&c[i]);
count[i]=dp[i]=0;
}
memset(dp,0,sizeof(dp));
memset(count,0,sizeof(count));
for (i=0;i<n;i++)
{
for (j=c[i];j<=endl;j++)
if (dp[j-c[i]]+p[i]>dp[j])
{
dp[j]=dp[j-c[i]]+p[i];
count[j]=count[j-c[i]]+1;
}
}
int flag=-1;
for (i=0;i<=endl;i++)
{//下标i是endurance,dp里存着经验,count里存着杀怪数
if (dp[i]>=expn&&count[i]<=s)//找到符合要求的
{//标记输出
flag = 1;
printf("%d\n",endl-i);
break;
}
}
if ( flag == -1 )
printf( "-1\n" );
}
return 0;
}
PS:终于进阶到完全背包了,上来就碰到这个两个限制条件的,着实懵了,只能抄了……不过也确实学会了一点,有收获!
PSS:一维的写法比较容易,还要再试试二维……