飯卡問題(0 1揹包的變形)

2022-08-05 10:24:27 字數 1123 閱讀 1510

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

某天,食堂中有n種菜**,每種菜可購買一次。已知每種菜的**以及卡上的餘額,問最少可使卡上的餘額為多少。 

input多組資料。對於每組資料: 

第一行為正整數n,表示菜的數量。n<=1000。 

第二行包括n個正整數,表示每種菜的**。**不超過50。 

第三行包括乙個正整數m,表示卡上的餘額。m<=1000。 

n=0表示資料結束。 

output對於每組輸入,輸出一行,包含乙個整數,表示卡上可能的最小餘額。sample input

1505

101 2 3 2 1 1 2 3 2 1

500

sample output

-45

32題目大意 :給你一些錢,讓你去食堂消費,每個菜只能點一次,且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...