電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望盡量使卡上的餘額最少。
某天,食堂中有n種菜**,每種菜可購買一次。已知每種菜的**以及卡上的餘額,問最少可使卡上的餘額為多少。
input多組資料。對於每組資料:
第一行為正整數n,表示菜的數量。n<=1000。
第二行包括n個正整數,表示每種菜的**。**不超過50。
第三行包括乙個正整數m,表示卡上的餘額。m<=1000。
n=0表示資料結束。
output對於每組輸入,輸出一行,包含乙個整數,表示卡上可能的最小餘額。sample input
1505sample output101 2 3 2 1 1 2 3 2 1
500
-4532題目大意 :給你一些錢,讓你去食堂消費,每個菜只能點一次,且5元以上可以任意點,5元以下不可以點,讓你求最後剩下的最少錢。
題目分析 :我們只要把5元單獨出來,用這5元消費最大的那個值。剩下的0-1揹包就可以了。
題目收穫 :動態轉移方程的變形
ac** :
#include #include#include
#include
#define maxn 1005
using
namespace
std;
intd[maxn];
bool cmp(int x, int
y)int
main()
sort(ni + 1, ni + 1 + n,cmp);//
求最大值
int ans = ni[1];//
儲存最大值
ni[1] = 0;//
最大者變為0
for (int i = 1; i <= n; i++)//
0-1模板
}printf(
"%d\n
", (m - 5) - d[m - 5] + 5 -ans);
}return0;
}
01揹包 問題變形 飯卡
example hdu 2546 解 利用 01揹包 狀態方程 f v max f v f v ci wi 1 對這個問題來說,干擾項是最後的5元,可以買任何一道菜,所以可以先用5元買最貴的一道菜 反正買最後一道菜時至少要有5元餘額,不如先不考慮這5元 去掉干擾項後就是乙個 01 問題了。2 一道菜...
HDU 2546 飯卡 01揹包變形
分析 每種菜可買一次或者不買,所以是01揹包 餘額m 5,只能買 餘額的菜 無法購買 餘額m 5,買最貴的菜 餘額m 5,先用 h m 5 去買菜,再用5去買最貴的菜。h視為揹包容量,菜的 a i 視為重量w和價值c。ac include include includeusing namespace...
01揹包問題變形
一 問題 二 解題思路 三 c 下面是我自己理解寫的,沒有根據標準答案的,那答案在講啥?一直沒法ac,不過還是可以解決問題的。n件物品按單位重量價值降序排序,然後回溯法裝,右結點必要時剪枝,剛好湊成重量為m的若干件物品才能得到乙個解。include define max 50 using names...