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

某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。 Input

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

第三行包括一个正整数m,表示卡上的余额。m<=1000。

n=0表示数据结束。 Output 对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。

Sample Input

1
501
5
10
1 2 3 2 1 1 2 3 2 1
50
0
Sample Output
-45
32

思路如下

这题一眼就可以看出是 01背包的模型,但是多了些限制条件:“饭卡余额少于5时无法继续购买”、“卡上金额大于等于5时,任何价格的菜都可以买,即使购买后卡上的余额为负”,若原来的卡上的钱小于5元什么也买不了直接输出 0 就行了;若卡上的金额大于等于5,对于第一个限制条件我们可以 把饭卡上的总金额 先减去5元(这个减去的5元是用来买 最大价格的 菜的,这里要好好考虑为什么是要买最 贵的菜),这样剩下的钱与剩下的 除最贵的菜以外的菜,就可以看成一个简单的01背包问题了

题解如下

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n) && n)
{
int sp[1005];
for(int i = 1;i <= n;i ++)
scanf("%d",&sp[i]);
int mon;
scanf("%d",&mon);
int tem_mon = mon - 5; //先减去5元
if(tem_mon < 0)
{
printf("%d\n",mon);
}
else
{
sort(sp+1,sp+1+n); //排序把最贵的菜 刨去单独用减去的5元购买
int f[1005] = {0};
int max_sp = sp[n]; //max_sp 最贵菜的 价钱
for(int i = 1;i < n;i ++)
for(int j = tem_mon;j >= sp[i];j --)
{
f[j] = max(f[j],f[j-sp[i]] + sp[i]);
}
printf("%d\n",mon - f[tem_mon] - max_sp);
}
}
return 0;
}

C - 饭卡的更多相关文章

  1. (01背包 排序+特判)饭卡(hdu 2546)

    http://acm.hdu.edu.cn/showproblem.php?pid=2546   Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额 ...

  2. hdu 2546 饭卡 删除一个数的01背包

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  3. DP入门---饭卡

    HDU   2546 Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额 ...

  4. HDOJ 2546饭卡(01背包问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如 ...

  5. cdoj 31 饭卡(card) 01背包

    饭卡(card) Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/31 Des ...

  6. hdoj 2546 饭卡

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  7. HDU 2546 饭卡

    http://acm.hdu.edu.cn/showproblem.php?pid=2546 呆呆. 饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memo ...

  8. 【贪心+背包】【HDU2546】【饭卡】

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. HDU2546:饭卡(01背包)

    HDU2546:饭卡 http://acm.hdu.edu.cn/showproblem.php?pid=2546 当我们遇到问题选择物体的价值和顺序相关时就需要,排完序后对其01处理.这题因为当我们 ...

  10. 饭卡------HDOJ杭电2546(还是01背包!!!!!!)

    Problem Description 电子科大本部食堂的饭卡有一种非常诡异的设计,即在购买之前推断剩余金额. 假设购买一个商品之前,卡上的剩余金额大于或等于5元,就一定能够购买成功(即使购买后卡上剩 ...

随机推荐

  1. SpringBoot1.5.10.RELEASE整合druid时,在druid monitor界面出现(*) property for user to setup

    接上篇随笔,配置druid之后出现的错误,解决方法如下: @Bean(destroyMethod = "close",initMethod = "init") ...

  2. 026.掌握Service-外部访问

    一 集群外部访问 由于Pod和Service都是Kubernetes集群范围内的虚拟概念,所以集群外的客户端默认情况,无法通过Pod的IP地址或者Service的虚拟IP地址:虚拟端口号进行访问.通常 ...

  3. RTP SIP win服务端软件 VOIP

    RTP Real-time Transport Protocol 实时传输入协议,使用 udp 做为载体. SIP Session Initiation Protocol 会话初始化协议,加入,查询, ...

  4. DEV GridControl控件使用(CheckBox全选、操作按钮、事件处理,获取值)

    1.GridControl控件使用 (1)绑定数据源 //绑定DataTable gridControl1.DataSource = DbHelper.ExecuteDataTable("S ...

  5. HTML实体符号代码

    1. 特色的 © © © 版权标志 |   | 竖线,常用作菜单或导航中的分隔符 · · · 圆点,有时被用来作为菜单分隔符 ↑ ↑ ↑ 上箭头,常用作网页“返回页面顶部”标识 € € € 欧元标识 ...

  6. [JS]使用JavaScript实现简易俄罗斯方块

    [JS]使用JavaScript实现简易俄罗斯方块 首先,大家可以点击此处来预览一下游戏效果,随后将会以此为模板讲解如何使用JavaScript实现这样一个简易的俄罗斯方块项目(以下简称"该 ...

  7. python基础学习day7

    基础数据类型的补充:编码的进阶 str capitalize() 首字母(第一个单词)大写,其余变小写 s1 = 'I LIVE YOU' print(s1.capitalize()) >> ...

  8. sklearn概述

    Simple and efficient tools for predictive data analysis Accessible to everybody, and reusable in var ...

  9. ssh 公钥 下载选择的时候 下拉选择 ssh 然后 git clone

    ssh 公钥 下载选择的时候 下拉选择 ssh 然后 git clone

  10. $api 回调函数then应用

    getReceiveListAPI (param) { return new Promise(resolve => { let params = { // idCard: this.idCard ...