hdu 2546 饭卡 dp
来源:互联网 发布:国外电视直播软件 编辑:程序博客网 时间:2024/05/16 13:40
问题描述:
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
解题思路:
先选出一个最大的。保证最后一次买这个最大的。这样可以使,卡上余额最少。
用m-5去买剩下的菜。
就可以转化为一个01背包问题。
ac代码:
#include<bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); int n,i,j,k,m; int a[1005]; int dp[1005]; while(cin>>n && n) { for(i=0;i<n;i++) cin>>a[i]; sort(a,a+n); int maxx=a[n-1]; cin>>m; if(m<5) { cout<<m<<endl; continue; } memset(dp,0,sizeof(dp)); for(i=0;i<n-1;i++) for(j=m-5;j>=a[i];j--) { dp[j]=max(dp[j],dp[j-a[i]]+a[i]); } cout<<m-dp[m-5]-maxx<<endl; }}
0 0
- HDU 2546 饭卡 DP
- hdu 2546 饭卡 dp
- hdu 2546 饭卡 dp
- HDU-2546 饭卡(DP)
- hdu 2546 饭卡(dp)
- HDU-2546 饭卡【线性dp】
- HDU-2546 饭卡( 背包dp )
- hdu 2546 饭卡(简单DP)
- HDU 2546饭卡(DP:01背包)
- HDU 2546 饭卡 DP+01背包
- hdu 2546 饭卡(经典dp)
- HDOJ(HDU).2546 饭卡(DP 01背包)
- HDU 2546 饭卡 DP/01背包
- hdu 2546(dp)
- hdu(2546)——饭卡(背包dp)
- HDU 2546 饭卡 【入门DP之01背包问题】
- HDU/HDOJ 2546 饭卡(DP,0/1背包)
- HDU DP
- myeclipse2016stable1.0下载,破解软件下载以及卸载后重装
- 正则表达式
- SpringMVC --hello world
- 相关函数在数字信号处理中的应用
- [webGL学习]基于three.js构建WebGL实例第一讲
- hdu 2546 饭卡 dp
- TQFP 和LQFP 器件的焊接方法
- Win10打开控制面板闪退,资源管理器自动重启问题的解决方案
- Tableview拖拽无法显示到最后一行或几行
- kali linux 更新源与输入法方法
- 解决Android界面布局添加EditText组件后界面无法预览的问题
- SDP协议分析
- 埃拉托色尼筛选法--JAVA
- dark story