1. 程式人生 > >HDU 2546飯卡 【01揹包水題】

HDU 2546飯卡 【01揹包水題】

先上題

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

此題的關鍵在於要使剩下5元去買到最貴的菜,則使m-=5,之後就是01揹包的裸題了

#include<iostream>
using namespace std;

#include<algorithm>

int main()
{
	int n;
	while (scanf("%d", &n) != EOF, n)
	{
		int price[1010] = { 0 };
		int dp[1010] = { 0 };
		for (int i = 1; i <= n; i++)
		{
			scanf("%d", &price[i]);
		}
		int m;
		scanf("%d", &m);
		if (m < 5)
		{
			cout << m << endl;
			continue;
		}
		sort(price + 1, price + 1 + n);
		int Maxn = price[n];
		m -= 5;
		for (int i = 1; i < n; i++)
		{
			for (int j = m; j >= price[i]; j--)
			{
				dp[j] = max(dp[j], dp[j - price[i]] + price[i]);
			}
		}
		cout << m + 5 - dp[m] - Maxn << endl;
	}
	return 0;
}

相關推薦

HDU 2546 01揹包

先上題 Problem Description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡

HDU 2546 01揹包

這是一道簡單的01揹包 題意:給你N種菜的價錢,給你一個初始的錢數,問你做多能花費多少 但是注意一個條件,當身上的錢>=5時,可以購買任何價錢的菜,如果<5則不能購買任何價錢的菜                                        

hdu-254601揹包

飯卡Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission

HDU 2546 01揹包

題意分析:01揹包 AC_CODE int n; int v[1002] , money; int dp[1002]; int main() { while(cin >> n && n) { int i , j

hdu 2546 01揹包+貪心)

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

HDU 2546 ……(01揹包+條件)

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int

HDU 2546 01揹包

Description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購

hdoj 2546 01揹包

飯卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16638    Accepted Submission(

hdu 2546 01揹包+貪心)

題目分析:要想使剩餘額最小,就要在就要用V=m-5的錢去買最多的菜,再用剩下的5元買最貴的菜; 先對菜價按升序排序,再用V買前i-1件 物品, #include<iostream> #include<cstdio> #include<algo

題解報告:hdu 2546 01背包)

set div input 解題思路 結束 hdu 2546 代碼 sizeof 以及 Problem Description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷余額。如果購買一個商品之前,卡上的剩余金額大於或等於5元,就一定可以購買成功(即使購買後

2546 01揹包

演算法:01揹包DP 難度:NOIP--- 先把最貴的一種菜找到不用,用剩餘金額減5的金錢去儘可能買 除掉最貴的菜後剩餘的菜類, 最後再用餘下的錢去買最貴的菜 注意:要特判m<5的

2546 01揹包,挺好的)

題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2546 思路:剛開始直接把揹包的容量搞為m-5+max1(max1的值為最貴的菜的價格),因為他最多的能花這麼多,結果錯了,應該把最大的單獨提出來,用5塊來買,剩下的錢做揹包 A

杭電 2546 01揹包

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望儘量使卡上的餘額最少。 某天,食堂中有n種菜出售,每種菜可購買一次。已知每種菜的價格以及卡上的餘額,問最

hdu 2546 動態規劃 01揹包

#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm&

HDU 2546 01揹包

題意:電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望儘量使卡上的餘額最少。 某天,食堂中有n種菜出售,每種菜可購

HDU 2546 01揹包變形

飯卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 22799    Accepted Submiss

HDU 254601揹包

飯卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41634    Accepted Submission(

01揹包-hdu 2546

思路: 把最大的那個值去掉,拿剩下的5元錢去買。 注意m<5的時候直接輸出。坑死了 #include <iostream> #include <stdio.h> #inc

hdu 2546 (貪心+01揹包

飯卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi

HDU 2546(DP—揹包問題)

飯卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S