HDU:2546 饭卡(经典01背包+贪心)

来源:互联网 发布:赛尔网络个人业务 编辑:程序博客网 时间:2024/05/24 03:28

饭卡

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23337    Accepted Submission(s): 8207


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

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

n=0表示数据结束。
 

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

Sample Input
1505101 2 3 2 1 1 2 3 2 1500
 

Sample Output
-4532
 

Source
UESTC 6th Programming Contest Online
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  2955 1203 2159 2191 1114 

题目大意:给你个饭卡,这个饭卡上有一定的余额,让你去食堂买饭,有n种饭,每种饭只能买一次,并且当你卡上的钱少于5快时,就无法买任何饭了,问你如何购买饭才能使得这个卡的消费价值最大,输出最终卡上剩余余额。
解题思路:既然说少于5快就不能买饭了,那么我们先去用总钱数-5块的钱数去买那些饭(除了最贵的那个)(01背包做),然后当你剩下五块时,去买那个最贵的饭,如此,就能让这个卡的消费价值最大了。(注意刚开始的钱数就少于5块的话,买不了任何饭,那么输出钱数本身)
代码如下:
一维写法:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[1010];int dp[1010];int main(){int n;while(scanf("%d",&n)!=EOF){if(n==0)break;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}int money;scanf("%d",&money);if(money<5){printf("%d\n",money);}else{sort(a+1,a+n+1);//排序,则第n个为最贵的饭 memset(dp,0,sizeof(dp));money=money-5;//先刨除那个5块 for(int i=1;i<n;i++)//刨除第n个最贵的饭 {for(int j=money;j>=a[i];j--)//倒序 {dp[j]=max(dp[j],dp[j-a[i]]+a[i]);}}printf("%d\n",money+5-dp[money]-a[n]);//money+5:原钱数    dp[money]:剩下钱能买的最大价值    a[n]最贵的那个饭 }}return 0;} 
二维写法:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[1010];int dp[1010][1010];int main(){int n;while(scanf("%d",&n)!=EOF){if(n==0)break;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}int money;scanf("%d",&money);if(money<5){printf("%d\n",money);}else{sort(a+1,a+n+1);memset(dp,0,sizeof(dp));money=money-5;for(int i=1;i<n;i++){for(int j=0;j<=money;j++){if(a[i]<=j){dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);}else{dp[i][j]=dp[i-1][j];}}}printf("%d\n",money+5-dp[n-1][money]-a[n]);}}return 0;} 

滚动数组写法:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[1010];int dp[2][1010];int main(){int n;while(scanf("%d",&n)!=EOF){if(n==0)break;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}int money;scanf("%d",&money);if(money<5){printf("%d\n",money);}else{sort(a+1,a+n+1);memset(dp,0,sizeof(dp));money=money-5;for(int i=1;i<n;i++){for(int j=0;j<=money;j++){if(a[i]<=j){dp[i%2][j]=max(dp[(i-1)%2][j],dp[(i-1)%2][j-a[i]]+a[i]);}else{dp[i%2][j]=dp[(i-1)%2][j];}}}printf("%d\n",money+5-dp[(n-1)%2][money]-a[n]);}}return 0;} 



1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 订机票时没有用常旅客卡怎么办 京东退货退款卖家已签收了怎么办 京东账号手机号换了密码忘了怎么办 qq飞车手游录像下载失败怎么办 手机知道qq号怎么破解密码怎么办 网上购物已付钱迟迟不发货怎么办 有人冒充微信头像和熟人借钱怎么办 微信红包输了50多万怎么办 脖子里的绳结接口磨脖子怎么办 母比格犬生了小狗毛色变了怎么办 母比格犬生了小狗毛色很差怎么办 貂皮大衣上的暗扣掉了怎么办 呢子夹克袖子长但又不想改短怎么办 黑色的衣服熨的有点发亮怎么办 宿管阿姨工作中与学生起冲突怎么办 中通快递发的衣服不合适怎么办 加盟母婴店如果不干了货怎么办 双十一搞活动买的东西退货怎么办 天猫预售30天不发货怎么办 天猫搞活动的商品总不发货怎么办 淘宝买的东西物流把货物损坏怎么办 苹果手机5s每部存满怎么办 天猫退货分开发货退的话怎么办 淘宝优惠券电脑端显示不出来怎么办 天猫退货退款寄错了怎么办 天猫已退款货又发过来了怎么办 小米商城预售订单点错退款了怎么办 淘宝发布宝贝类目价格受限制怎么办 2019天猫续签评分不达标怎么办 天猫店铺动态不达标不能续签怎么办 京东自提发现货有问题怎么办 京东试用成功商家不发货怎么办 在淘宝主页搜不到我的店铺名怎么办 淘宝发货单号填到别人那去了怎么办 买家申请淘宝介入后同意退款怎么办 淘宝卖家手机版购买装修模块怎么办 天猫店铺和淘宝店铺想要装修怎么办 支付宝转账银行卡卡号错误怎么办 淘宝图片空间照片全部删除了怎么办 我把淘宝图片空间照片删除了怎么办 淘宝发布宝贝怎么没知道品牌怎么办