<span style="color:#3333ff;">/*
————————————————————————————————————————————————————————————————————————————————————————————————
author : Grant Yuan
time : 2014.7.19
aldorithm: 二维背包+全然背包 ————————————————————————————————————————————————————————————————————————————————————————————————
B - 二维费用背包 基础
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status
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<cstdlib>
#include<cstring>
#include<algorithm>
#define INF 9999999;
using namespace std; int dp[2][105][105];
int exp,exd,num,kid;
//exp:经验 ;exd: 忍耐度; num:怪的个数; kid:怪的种类;
//dp[前i种怪][已经杀了j个怪][消耗k的忍耐度]=所获得经验的最大值
int b[105],a[105]; int main()
{
while(~scanf("%d%d%d%d",&exp,&exd,&kid,&num)){ for(int i=0;i<kid;i++)
scanf("%d%d",&a[i],&b[i]);
memset(dp,0,sizeof(dp)); for(int i=0;i<kid;i++)//种类
for(int j=1;j<=num;j++)//杀怪的个数
for(int k=0;k<=exd;k++)//消耗的忍耐度
{
if(k>=b[i])
dp[(i+1)&1][j][k]=max(dp[(i+1)&1][j-1][k-b[i]]+a[i],dp[i&1][j][k]);
else
dp[(i+1)&1][j][k]=dp[i&1][j][k];
} int m=INF;
if(dp[kid&1][num][exd]<exp)
printf("-1\n");
else {//寻找最小的忍耐度
for(int k=0;k<=exd;k++)
if(dp[kid&1][num][k]>=exp&&k<m)
m=k;
cout<<exd-m<<endl;
}
}
return 0;
} #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define INF 9999999;
using namespace std; int dp[105][105];
int exp,exd,num,kid;
//exp:经验 ;exd: 忍耐度; num:怪的个数; kid:怪的种类;
//dp[前i种怪][已经杀了j个怪][消耗k的忍耐度]=所获得经验的最大值
int b[105],a[105]; int main()
{
while(~scanf("%d%d%d%d",&exp,&exd,&kid,&num)){ for(int i=0;i<kid;i++)
scanf("%d%d",&a[i],&b[i]);
memset(dp,0,sizeof(dp)); for(int i=0;i<kid;i++)//种类
for(int j=1;j<=num;j++)//杀怪的个数
for(int k=exd;k>=b[i];k--)//消耗的忍耐度
{
dp[j][k]=max(dp[j-1][k-b[i]]+a[i],dp[j][k]);
}
int m=INF;
if(dp[num][exd]<exp)
printf("-1\n"); else {//寻找最小的忍耐度
for(int k=0;k<=exd;k++)
if(dp[num][k]>=exp&&k<m)
m=k;
cout<<exd-m<<endl;
}
}
return 0;
}
</span>

版权声明:本文博主原创文章,博客,未经同意不得转载。

B 维背包+完全背包 Hdu2159的更多相关文章

  1. 2159 ACM 杭电 杀怪 二维费用的背包+完全背包问题

    题意:已知经验值,保留的忍耐度,怪的种数和最多的杀怪数.求进入下一级的最优方案. 思路:用二维费用的背包+完全背包问题 (顺序循环)方法求解 什么是二维费用的背包问题? 问题: 二维费用的背包问题是指 ...

  2. HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)

    HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...

  3. 背包!背包!HDU 2602 Bone Collector + HDU 1114 Piggy-Bank + HDU 2191 512

    http://acm.hdu.edu.cn/showproblem.php?pid=2602 第一题 01背包问题 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  4. dp--01背包,完全背包,多重背包

    背包问题 以下代码 n是物品个数,m是背包容积 物品价值和重量int v[maxn],w[maxn]; 01背包 模板 for(int i = 0; i < n; i++) { for(int ...

  5. POJ 3260 多重背包+完全背包

    前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168 ...

  6. 【poj3260-最少找零】多重背包+完全背包

    多重背包+完全背包. 买家:多重背包:售货员:完全背包: 开两个数组,分别计算出买家,售货员每个面额的最少张数. 最重要的是上界的处理:上界为maxw*maxw+m(maxw最大面额的纸币). (网上 ...

  7. POJ 3260 The Fewest Coins(多重背包+全然背包)

    POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...

  8. (hdu)5234 Happy birthday 二维dp+01背包

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5234 Problem Description Today is Gorwin’s birt ...

  9. POJ 1787 Charlie's Change (完全背包/多重背包,输出方案的物品个数)

    网上说是多重背包,因为要输出方案,还要记录下路径,百度一下题解就可以. 自己做的时候,还没了解过多重背包,该题直接往完全背包思考了.咖啡的钱看作总的背包容量,1.5.10.25分别代表四种物品的重量, ...

随机推荐

  1. jquery常用方法总结(转)

    取值与赋值操作 $("#ID").val(); //取value值 $("#ID").val("xxx"); //赋值 $("#I ...

  2. [RxJS] Hot Observable, by .share()

    .share() is an alias for .publish().refCount(). So if the source is not yet completed, no matter how ...

  3. JavaScript对象的继承

    原文 简书原文:https://www.jianshu.com/p/78ce11762f39 大纲 前言 1.原型链继承 2.借用构造函数实现继承 3.组合模式继承 4.原型式继承 5.寄生式继承 6 ...

  4. [Webpack] Configure Prepack with Webpack

    Great improvements and optimizations can be made to the output of bundled code. Prepack provides the ...

  5. js进阶js中支持正则的四个常用字符串函数(search march replace split)

    js进阶js中支持正则的四个常用字符串函数(search march replace split) 一.总结 代码中详细四个函数的用法 search march replace split 二.js进 ...

  6. php实现 简单密码(代码颜色变化)

    php实现  简单密码(代码颜色变化) 一.总结 一句话总结:写代码的时候一定要关注代码的颜色变化,不然低级错误害死人.常量变量会有不同颜色,所以$str少$符号变成常量的时候很容易发现. 1.变量$ ...

  7. 本人录制的视频资源(C/C++、Go、Qt、Linux等)

    持续更新-- 编程语言 C语言开发实战:http://pan.baidu.com/s/1qXAP4x2 C语言贪吃蛇:https://pan.baidu.com/s/1pLRZIuJ C提高:http ...

  8. JAVA类(下)

    我看完了Java类,与C++相比,复杂了一点.其中有类的嵌套定义即内部类,枚举类等. 我看这两节花了我很多时间.其中有一些概念还是有点难懂. 下面,我详细总结内部类与枚举类. 内部类 内部类的主要作用 ...

  9. 【t019】window(线段树做法)

    Time Limit: 2 second Memory Limit: 256 MB [问题描述] 给你一个长度为N 的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右 ...

  10. [Ramda] Change Object Properties with Ramda Lenses

    In this lesson we'll learn the basics of using lenses in Ramda and see how they enable you to focus ...