HDU 2546 飯卡 01揹包 預處理

2021-08-15 12:34:59 字數 1005 閱讀 1610

這是一道01揹包問題,但是需要預處理一下,因為當你的錢不夠5塊錢的時候,你什麼都買不了,所以直接輸出錢數,當你的錢大於5塊錢的時候,你可以先拿出來5塊錢,留著最後去買最貴的菜,現在你剩下m-5塊錢,排個序把最貴的留在最後,然後就用01揹包把這m-5盡量裝滿(遍歷1~n-1種菜,因為n是最貴的菜要留給最後),然後再用那剩下的5塊錢去買最貴的菜,最後就是最優解m-dp[m-5]-dp[n]。我寫的**是從0開始的,所以最後的解是m-dp[m-5]-dp[n-1],理解就好。。

ac**:

#include #include #include #include using namespace std;

const int maxn = 100005;

int dp[maxn];

int c[maxn];

int n,m;

int main()

}printf("%d\n",m - c[n-1] - dp[m-5]); // m是總錢數,c[n-1]是最貴的菜,dp[m-5]是當前最貴的狀態

}} return 0;}/*

[**] hdu 2546

[題目] 飯卡

[大意]

有一張飯卡,買飯的之前需要判斷一下是不是大於5,小於5的話就不能買了,直接輸出這個錢數就好了,大於5的

話,先排一下序,然後按01揹包寫就好,具體過程看**注釋吧。

[輸入]150

510

1 2 3 2 1 1 2 3 2 1500

[輸出]

-4532

*/

HDU2546 飯卡 01揹包

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

HDU 2546 飯卡 01揹包

我的做法是找出n種菜中最貴的 k,把揹包的容量m增加的到m k 然後對 排個序,因為dp是從第乙個菜到最後乙個菜,越貴的菜越後選結果越小,然後進行dp include include include include using namespace std const int maxn 1010 in...

hdu2546飯卡 01揹包

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