HDU-2159FATE(二维完全背包)

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

二维完全背包

这道题目有了对物品个数的限制,也相当于加了一维费用,直接加一维状态(其实现在感觉对二维的限制还有点一知半解)。

中文题,意思很明确,用最小的忍耐度,获得刚好的经验值,再加一维对物品的限制。

注意01背包(逆序),完全背包(顺序),多重背包,他们之间的循环顺序。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int max_size = 110;
 8 int val[max_size]; ///经验值
 9 int weg[max_size]; ///忍耐度
10 int dp[max_size][max_size];
11
12 int main()
13 {
14     int n1, m1, k1, s1;
15     ///经验值,保留的忍耐度,怪的种数和最多的杀怪数
16
17     while(scanf("%d %d %d %d", &n1, &m1, &k1, &s1) != EOF)
18     {
19         memset(dp, 0, sizeof(dp));
20         for(int i = 0; i < k1; i++)
21         {
22             scanf("%d %d", val+i, weg+i);
23         }
24
25         int ans = 1000000;
26         for(int i = 0; i < k1; i++)
27         {
28             for(int j = weg[i]; j <= m1; j++)
29             {
30                 for(int k = 1; k <= s1; k++)
31                 {
32                     dp[j][k] = max(dp[j][k], dp[j-weg[i]][k-1] + val[i]);
33                     if(dp[j][k] >= n1 && ans >= j) ///找恰好满足条件的这个方法是对的,昨天和亮哥说,还以为错了呢。
34                         ans = j;                    ///这里的j是用掉的忍耐度
35                 }
36             }
37         }
38         if(ans != 1000000)
39         {
40             printf("%d\n", m1 - ans);
41         }
42         else
43         {
44             printf("-1\n");
45         }
46     }
47     return 0;
48 }

时间: 2024-10-10 21:21:02

HDU-2159FATE(二维完全背包)的相关文章

HDU 2159FATE(二维背包)

题目地址:HDU 2159 二维的背包,刚开始用的一维,老感觉哪里不对,有两个制约因素.于是就改成了二维的,就过了.. 代码如下: #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <sta

hdu 2159 二维完全背包

背景:二维数组为限制条件的完全背包,1Y. 思路:转移方程:F[i][j]=max{F[i][j],F[i-1][j-C[k]+W[k]},F[i][j]为在i为最大人数为i,最大忍耐度为j的情况下所能达到的最大经验值.一旦经验值达到目标要求经验值,就记录当前罪恶值,找出所有大到经验要求罪恶值中的最小罪恶值即可. 学习:进化仍然是转移方程的确立,背包类问题,按照模型进行变换就好.找到限制条件和物品选择,对限制条件进行拆分为每种可能的离散块. 我的代码: #include<cstdio> #in

HDU 2159 FATE (二维多重背包)

FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9352    Accepted Submission(s): 4413 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.现在的问

HDU 2159 FATE(二维完全背包)

中文题目就不用解释了   就是裸的二维完全背包 d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验  然后就用完全背包来做了  二维背包背包不过是多了一重循环 <span style="font-family:Arial Black;">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 105; int ma

HDU 2159 FATE【二维多重背包】

大意:二维多重背包 分析:二维多重背包 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 105; 8 int dp[maxn][maxn]; 9 int a[maxn], b[maxn]; 10 11 int main() { 12 int n,

hdu 3496 二维费用的01背包

算是比较简单的二维费用背包了吧,注意在某一维上要求“装满”. 另外:对于多维费用的背包,最内层的循环可以逆着写,想一想,为什么. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int INF = -99999999; 8 const int N = 101; 9 con

HDU 2159 FATE (二维完全背包)

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

HDU 2159 FATE(二维全然背包)

中文题目就不用解释了   就是裸的二维全然背包 d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验  然后就用全然背包来做了  二维背包背包只是是多了一重循环 <span style="font-family:Arial Black;">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 105; int ma

hdu3496 二维01背包

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3496 //刚看题目以为是简单的二维01背包,but,,有WA点.. 思路:题中说,只能买M个光盘,不能多也不能少,所以就要求把背包装满. 恰好把背包装满,那么在初始化时,除了dp[0]=0,剩下的dp[1~M],均为负无穷(其实设置成-1,到时候在判断一下也是一样的,思想相同) 这样才可以保证最终得到的dp[M]是一种恰好装满背包状态的最优解. 代码: #include<iostream

HDU2159 二维完全背包

FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12533    Accepted Submission(s): 5932 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.现在的问