A - 饭卡

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
 

Input

多组数据。对于每组数据:
第一行为正整数n,表示菜的数量。n<=1000。
第二行包括n个正整数,表示每种菜的价格。价格不超过50。
第三行包括一个正整数m,表示卡上的余额。m<=1000。

n=0表示数据结束。

 

Output

对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。
 

Sample Input

1
50
5
10
12 3 2 1 1 2 3 2 1
50
0
 

Sample Output

-45
32
 

好久没做背包题目了,又有点概念不清了

自己思维还是有点乱,一开始就在纠结这个卡上余额为负值的情况,然后按照常规背包的做法,先把东西塞进去,遇到减出来时负值的情况,则减去最大价值的菜

看上去好像可以,但是会WA

真正的准确思路其实不难想到,在卡上余额大于5的时候,就按常规背包去塞最大化的东西,也就是说,之前就刻意缩小背包容量,使得它为 w-5;这样就能求出卡余额在5元以上的时候,最大的消费额。。。当然,在这之前还要找到最大值得菜,这样,背包之后,再减去最大值的菜。就一定是最余额了。。

其实思路真的很简单,以大于5的卡,做背包,。。剩下的只要减去最大值得菜就行。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int fruit[];
int card[];
int max(int x,int y)
{
if (x>y) return x;
else
return y;
}
int main()
{
int n;
while (scanf("%d",&n)&&n)
{
int i;
for (i=; i<n; i++)
scanf("%d",&fruit[i]);
int maxn=;
int loc;
for (i=; i<n; i++)
if (maxn<fruit[i])
{
maxn=fruit[i];
loc=i;
}
int yu;
scanf("%d",&yu);
if (yu<) //如果初始额度即为小于5,则直接输出
{
printf("%d\n",yu);
continue;
}
memset(card,,sizeof card);
for (int j=; j<n; j++)
{
if (j==loc) continue;
for (int k=yu-; k>=; k--) //一度忘记了,要从最大值开始递减背包,一开始居然从0开始递增背包,这样会出现状态混乱,这样才能保证每次比较的是前一次的状态和当前状态。
{
if (k>=fruit[j])
card[k]=max(card[k],card[k-fruit[j]]+fruit[j]);
}
}
int ans=yu-card[yu-]-maxn;
printf("%d\n",ans);
}
return ;
}
 

HDU _2546 01背包问题的更多相关文章

  1. HDU 1171 (01背包问题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1171 分析: 例如数据 3 10    2 20    1 30    1 获得这样一个降序的数组: ...

  2. HDU 2546 01背包问题

    这里5元是个什么意思呢.差不多就是特殊情况了. 就是说最贵的那个东西先不买.并且最后要留下5元去买那个最贵的. 也就是说对现在金钱-5 拿剩下的钱去对减去最贵的商品后的商品dp.看这些剩下的钱能买多少 ...

  3. HDU 1864最大报销额 01背包问题

    B - 最大报销额 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  4. HDU 2602 Bone Collector(经典01背包问题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/O ...

  5. HDU 3466 Proud Merchants 带有限制的01背包问题

    HDU 3466 Proud Merchants 带有限制的01背包问题 题意 最近,伊萨去了一个古老的国家.在这么长的时间里,它是世界上最富有.最强大的王国.因此,即使他们的国家不再那么富有,这个国 ...

  6. HDU 2602 Bone Collector (01背包问题)

    原题代号:HDU 2602 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 原题描述: Problem Description Many yea ...

  7. HDU 2546 饭卡 (01背包问题)

    题意:中文的吧,飘过~ 析:学过DP的都应该感觉到是动态规划吧,就是一个01背包问题,不同的是,这个题又加入一些新的条件,就是不满5元不能消费,过了5元即使超了也行(这个学校真不错,都可以预支),最后 ...

  8. 动态规划专题 01背包问题详解 HDU 2546 饭卡

    我以此题为例,详细分析01背包问题,希望该题能够为大家对01背包问题的理解有所帮助,对这篇博文有什么问题可以向我提问,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java ...

  9. HDU 2602Bone Collector 01背包问题

    题意:给出一个t代表有t组数据,然后给出n,n代表有n种石头,v代表旅行者的背包容量,然后给出n种石头的价值和容量大小,求能带走的最大价值 思路:01背包问题,每种石头只有拿与不拿两种状态.(其实我是 ...

随机推荐

  1. P1079 延迟的回文数

    P1079 延迟的回文数 转跳点:

  2. Codeforces 546 E:士兵的旅行 最大网络流

    E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabytes input stan ...

  3. 2-10 就业课(2.0)-oozie:3、安装2

    第七步:修改oozie-site.xml cd /export/servers/oozie-4.1.0-cdh5.14.0/conf vim oozie-site.xml 如果没有这些属性,直接添加进 ...

  4. ROS常用库(五)navigation之Tutorials

    一.TF 详见古月居 https://www.guyuehome.com/355 重点:广播TF,订阅,编译时Cmakelist添加编译选项 broadcaster.sendTransform( tf ...

  5. mysql提示 Lock wait timeout exceeded解决办法 事务锁死

    查询  select concat('KILL ',id,';') from information_schema.processlist; 复制结果 新建sql脚本粘贴并执行

  6. PHP使用ElasticSearch做搜索

    PHP 使用 ElasticSearch 做搜索 https://blog.csdn.net/zhanghao143lina/article/details/80280321 https://www. ...

  7. Redis详解(五)——主从复制

    Redis详解(五)--主从复制 面临问题 机器故障.我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的.而数据是最重要的,如果你不在乎,基本上也就不 ...

  8. Django(一)基础:安装环境、创建项目、视图、创建一个项目的应用(app)

    一.安装环境 参考: https://docs.djangoproject.com/zh-hans https://www.runoob.com/django/django-install.html ...

  9. 吴裕雄--天生自然java开发常用类库学习笔记:大数操作

    import java.math.* ; class MyMath{ public static double add(double d1,double d2){ // 进行加法计算 BigDecim ...

  10. 《ES6标准入门》(阮一峰)--9.数组的扩展

    1.扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 ...