HDU-2546 饭卡 ( DP )
Posted 「空白」物語
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-2546 饭卡 ( DP )相关的知识,希望对你有一定的参考价值。
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2546
Problem Description
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
Input
多组数据。对于每组数据:
第一行为正整数n,表示菜的数量。n<=1000。
第二行包括n个正整数,表示每种菜的价格。价格不超过50。
第三行包括一个正整数m,表示卡上的余额。m<=1000。
n=0表示数据结束。
第一行为正整数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
对价格排序,提出最大值,然后将余额减5,即为01背包问题。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int meal[1005]; 7 int dp[1005]; 8 int n, m; 9 10 int main(){ 11 ios::sync_with_stdio( false ); 12 13 while( cin >> n, n ){ 14 meal[0] = 0; 15 16 for( int i = 1; i <= n; i++ ) 17 cin >> meal[i]; 18 sort( meal + 1, meal + n + 1 ); 19 cin >> m; 20 21 memset( dp, 0, sizeof( dp ) ); 22 23 if( m < 5 ){ 24 cout << m << endl; 25 continue; 26 } 27 28 for( int i = 1; i < n; i++ ){ 29 for( int j = m-5; j >= meal[i]; j-- ) 30 if( dp[j] < dp[j - meal[i]] + meal[i] ) 31 dp[j] = dp[j - meal[i]] + meal[i]; 32 } 33 34 cout << m - dp[m - 5] - meal[n] << endl; 35 } 36 37 return 0; 38 }
以上是关于HDU-2546 饭卡 ( DP )的主要内容,如果未能解决你的问题,请参考以下文章