HDU2546(01背包)
来源:互联网 发布:广州网站seo 编辑:程序博客网 时间:2024/05/22 07:56
饭卡
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19863 Accepted Submission(s): 6914
Problem Description
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
Input
多组数据。对于每组数据:
第一行为正整数n,表示菜的数量。n<=1000。
第二行包括n个正整数,表示每种菜的价格。价格不超过50。
第三行包括一个正整数m,表示卡上的余额。m<=1000。
n=0表示数据结束。
Output
对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。
Sample Input
1
50
5
10
1 2 3 2 1 1 2 3 2 1
50
0
Sample Output
-45
32
Source
UESTC 6th Programming Contest Online
转化之后就是一个非常裸的01背包。我们要做的就是找到最接近m-5的值,也就是要尽量的把钱用到剩下五块,这一步就是01背包。然后把求出的这个值加上一个最贵的菜价就是我们能买到的最贵的总额然后做个减法就结束了。
#include "cstring"#include "cstdio"#include "iostream"#include "algorithm"using namespace std;int max(int a,int b){ if(a>b) return a; else return b;}int val[250002];int dp[250002];int main(){ int n; while(scanf("%d",&n)&&n!=0) { int sum=0; for(int i=1;i<=n;i++) scanf("%d",&val[i]); sort(val+1,val+n+1); int m; scanf("%d",&m); if(m<5) { printf("%d\n",m); continue; } memset(dp,0,sizeof(dp)); for(int i=1;i<=n-1;i++) { for(int j=m-5;j>=val[i];j--) { dp[j]=max(dp[j],dp[j-val[i]]+val[i]); } } printf("%d\n",m-(dp[m-5]+val[n])); }}
- HDU2546 (01背包)
- HDU2546(01背包)
- hdu2546 饭卡(01背包)
- hdu2546饭卡(01背包)
- hdu2546 饭卡 (01背包)
- hdu2546饭卡(01背包)
- HDU2546 饭卡(01背包)
- HDU2546--饭卡(01背包)
- hdu2546(01背包变形)
- HDU2546 饭卡(01背包)
- HDU2546~饭卡(01背包)
- hdu2546 饭卡 (dp 01背包)
- hdu2546饭卡(动规 01背包)
- hdu2546 — 饭卡 (01背包)
- hdu2546 饭卡(01背包水)
- hdu2546 饭卡(01背包 dp)
- hdu2546饭卡(经典01背包题目)
- HDU2546 01背包
- 【项目】:图像识别中的排序算法
- springmvc 使用BeanNameViewResolver解析excel,pdf,json,xml视图
- (5)Java设计模式-原型模式(Prototype)
- 《MySQL必知必会学习笔记》:事务处理
- html5的原生态拖放
- HDU2546(01背包)
- 【第一帖】东南大学 无线通信专业 小硕一枚,希望能和各位共同学习
- 编码-京东实习笔试编程题-生日礼物-动态规划
- 各个时期的XCode dmg下载
- Coverity检测规则-概述
- 欢迎使用CSDN-markdown编辑器
- Ruby on Rails 初次冲浪体验
- C++作业3
- CodeForces - 660E Different Subsets For All Tuples (组合数学&DP)好题