這是一道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種菜 每種菜可購買一...