C - 饭卡
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于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 - 饭卡的更多相关文章
- (01背包 排序+特判)饭卡(hdu 2546)
http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额 ...
- hdu 2546 饭卡 删除一个数的01背包
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- DP入门---饭卡
HDU 2546 Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额 ...
- HDOJ 2546饭卡(01背包问题)
http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如 ...
- cdoj 31 饭卡(card) 01背包
饭卡(card) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/31 Des ...
- hdoj 2546 饭卡
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- HDU 2546 饭卡
http://acm.hdu.edu.cn/showproblem.php?pid=2546 呆呆. 饭卡 Time Limit: 5000/1000 MS (Java/Others) Memo ...
- 【贪心+背包】【HDU2546】【饭卡】
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- HDU2546:饭卡(01背包)
HDU2546:饭卡 http://acm.hdu.edu.cn/showproblem.php?pid=2546 当我们遇到问题选择物体的价值和顺序相关时就需要,排完序后对其01处理.这题因为当我们 ...
- 饭卡------HDOJ杭电2546(还是01背包!!!!!!)
Problem Description 电子科大本部食堂的饭卡有一种非常诡异的设计,即在购买之前推断剩余金额. 假设购买一个商品之前,卡上的剩余金额大于或等于5元,就一定能够购买成功(即使购买后卡上剩 ...
随机推荐
- 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型
本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...
- 使用Navicat Premiun远程连接MySQL失败,报错(10038)
远程连接MySQL失败,可能有一下原因: 1.小伙子/小姑凉注意一下你的ip是否输入正确了!! 2.网络或防火墙问题 1).排查网络问题 使用命令:ping 192.168.1.1 查看网络请求是否超 ...
- Effective Go中文版(更新中)
原文链接:https://golang.org/doc/effective_go.html Introduction Go是一种新兴的编程语言.虽然它借鉴了现有语言的思想,但它具有不同寻常的特性,使得 ...
- jupyter 安装问题 building 'zmq.libzmq' extension error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
1.用pip install jupyter 安装到一半就报错 错误提示: building 'zmq.libzmq' extension error: Microsoft Visual C++ 14 ...
- Yaml文件,超详细讲解
YAML文件简单介绍 YAML 是一种可读性非常高,与程序语言数据结构非常接近.同时具备丰富的表达能力和可扩展性,并且易于使用的数据标记语言. YAML全称其实是"YAML Ain't a ...
- vscode配置里关于 eslint配置不要有 "eslint.alwaysShowStatus": true
"eslint.autoFixOnSave": true, "eslint.validate": [ "javascript", " ...
- Python基础篇(二)_基本数据类型
Python基础篇——基本数据类型 数字类型:整数类型.浮点数类型.复数类型 整数类型:4种进制表示形式:十进制.二进制.八进制.十六进制,默认采用十进制,其他进制需要增加引导符号 进制种类 引导符号 ...
- java第二节课课后
动手动脑问题 : 程序源代码: //MethodOverload.java //Using overloaded methods public class MethodOverload { publi ...
- F-NAScan:一款网络资产扫描工具
此脚本的大概流程为: ICMP存活探测-->端口开放探测-->端口指纹服务识别-->提取快照(若为WEB)-->生成结果报表 用法 python NAScan.py -h 10 ...
- shell编程之循环语句
for #! /bin/sh for FRUIT in apple banana pear; do echo "I like $FRUIT" done while #! /bin/ ...