HDU 2546 飯卡(簡單dp 01揹包)

2021-09-10 05:44:38 字數 764 閱讀 5831

先上**

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

int n, m, dp[1060], val[1005];

int main()

}for (int i=0; i<=m+45; i++)

printf("%d\n", m-mx);

}return 0;}/*

101 2 3 2 1 1 2 3 2 1

10*/

挺簡單的一道題,01揹包的變形。餘額最少不就是要花掉的錢最多嘛,假如沒有5塊錢這個條件,那麼其實就是在給定餘額(揹包容量)下選擇一些菜(物品)消耗餘額(放進揹包),讓菜的總價(物品總價值)最大,同時菜的總價(物品總重量)不超過餘額。

嗯這題裡菜的**既是物品價值又是重量。

然後說5塊錢以下不讓消費(流下了貧窮的淚水)這個條件也好辦,等於揹包容量-5。

然後又說超過5塊可以買超過飯卡餘額的菜品(sorry~有錢是真的可以為所欲為的~)。怎麼辦呢,反正食品價不超過50,所以最後總價最多也就是餘額加上50。再抵掉前面的5塊,最後相當於給揹包容量加上45。

這樣就可以快落地當成揹包問題做啦,只不過在狀態轉移

dp[j]=max(dp[j], dp[j-x]+x);
的時候需要在前面加上乙個判斷條件

if (dp[j-x]<=m-5)
其意義是判斷在加上這件物品前是不是餘額已經小於5了。

hdu2546 飯卡(01揹包 dp)

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

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...