HDU FATE (完全背包+有限取次)(二重费用背包)



FATE

Problem Description

最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗?

Input

输入数据有多组,对于每组数据第一行输入n,m,k,s(0 < n,m,k,s < 100)四个正整数。分别表示还需的经验值,保留的忍耐度,怪的种数和最多的杀怪数。接下来输入k行数据。每行数据输入两个正整数a,b(0 < a,b < 20);分别表示杀掉一只这种怪xhd会得到的经验值和会减掉的忍耐度。(每种怪都有无数个)

Output

输出升完这级还能保留的最大忍耐度,如果无法升完这级输出-1。

Sample Input

10 10 1 10
1 1
10 10 1 9
1 1
9 10 2 10
1 1
2 2

Sample Output

0
-1
1

**********************************************************************************************************

解法一:完全背包

********************************

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cctype>
#define INF 0x3f3f3f3f
#define maxn 100+10

using namespace std;

int cost[maxn],val[maxn],cnt[maxn];
int dp[maxn];
int n,m,k,s;

void completepack()
{
    memset(cnt,0,sizeof cnt);
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=k;i++)
        for(int j=cost[i];j<=m;j++)
        {
            if(dp[j]<dp[j-cost[i]]+val[i])
            {
                cnt[j]=cnt[j-cost[i]]+1;              //计数数组
                dp[j]=dp[j-cost[i]]+val[i];
            }
        }
}

int main()
{
    while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
    {
        int ok=1;
        for(int i=1;i<=k;i++)
            scanf("%d%d",val+i,cost+i);
        completepack();
        for(int i=0;i<=m;i++)                    //这里貌似是题目的bug,经验可以为0.
        {
            if(dp[i]>=n&&cnt[i]<=s)
            {
                printf("%d\n",m-i);
                ok=0;
                break;
            }

        }
        if(ok)
           printf("-1\n");
    }

    return 0;
}

**********************************************************************************************************

解法一:二重费用背包

********************************

代码后续-----------



HDU FATE (完全背包+有限取次)(二重费用背包)

时间: 2024-11-05 00:46:43

HDU FATE (完全背包+有限取次)(二重费用背包)的相关文章

HDU 2159 FATE (完全背包+有限尚需时日)()双费背包

 FATE Problem Description 近期xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd開始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.如今的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到对应的经验,并减掉对应的忍耐度.当忍耐度降到0或者0下面时,xhd就不会玩这游戏. xhd还说了他最多仅仅杀s仅仅怪.请问他能升掉这最后一级吗? Input 输入数据有多组,对于每组数据第一行

[ACM] hdu 2191 珍惜如今,感恩生活 (多重背包)

Problem Description 急!灾区的食物依旧短缺! 为了拯救灾区同胞的生命,心系灾区同胞的你准备自己採购一些粮食支援灾区,如今如果你一共同拥有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,而且仅仅能整袋购买. 请问:你用有限的资金最多能採购多少公斤粮食呢? 后记: 人生是一个充满了变数的生命过程,天灾.人祸.病痛是我们生命历程中不可预知的威胁. 月有阴晴圆缺,人有旦夕祸福,未来对于我们而言是一个未知数.那么,我们要做的就应该是珍惜如今,感恩生活-- 感谢父母,他们给

hdu 1561The more, The Better(树形dp&amp;01背包)

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4949    Accepted Submission(s): 2918 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝

hdu 5616 Jam&#39;s balance(dp 正反01背包)

来自官方题解: AC代码: 1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<math.h> 7 #include<algorithm> 8 #include<queu

HDU 4003 Find Metal Minaral 树上瞎搞分组背包

对于分组背包,每组选且只选一件商品的写法只想出了二维数组的写法. dp[s][k] 表示 在前s类中选取价格为 k 的商品的最优解. dp[s][k] = max( dp[s-1][k-product[s][j].c] + product[s][j].w).dp[s][k]每次只会有dp[s-1]更新得到,保证了前s-1类商品的选取. 对于此题,可以把每棵子树的情况看成一类商品,递归求解. dp[s][k]表示在s子树上投入k个机器人时的最优解. 当k == 0时,表示在s点投入1个机器人,且此

0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.其中每种物品只有一件,可以选择放或者不放. 最优子结构性质:对于0-1问题,考虑重量至多W的最值钱的一包东西.如果去掉其中一个物品j,余下的必是除j以外的n-1件物品中,可以带走的重量

POJ2184Cow Exhibition(二维费用背包)

Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9067   Accepted: 3441 Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to t

HDU2159 二维费用背包

题目链接:FATE 状态转移方程: dp[ren][num] =max(dp[ren-耐久值][num-1]+ 经验值,dp[ren][num]) dp表示:当前忍耐度ren下杀敌数为num的经验值 枚举分别枚举 所有怪物种类.耐久度.杀怪数 最后在从小到达枚举消耗的耐久度即可 #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <

hdu--2159--二维费用背包&lt;一维错误解法&gt;

这题 还好 我A了之后 习惯性地去看了下 discuss  然后发现 基本上所有人的解法都在说 二维费用完全背包... 还好 看到一个人 是和我一样的用 一维 完全背包 加一个计数的cnt数组去解决的... 还好 在那边看到了一个人的质疑 并给出了一组数据  果然 一维的不能通过=-=那就只能 去学下 二维费用背包了...擦 这名字好长啊 因为 当时 我背包九讲只学到了01 完全 多重 后面就没学了 ... 二维费用背包要是一般的话 很简单的 就是多了一层for而已  而且假如这个数组是dp[