hdu 2159 FATE

本文针对HDU 2159 FATE问题,采用完全背包算法解决含有两个限制条件(经验值和忍耐度)的问题。通过建立计数数组记录杀怪数量,实现对无限数量怪物的有效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:一维的写法比较容易,还要再试试二维……





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值