題目大意:給出n種菜的**p(i)和飯卡上的餘額m,要求飯卡上的餘額m>=5元時才能買飯,切一定能購買成功(即餘額可以為負值),現在問你餘額最小為多少。
我們知道:
(1)當m>5元時由於不能購買飯菜,所以此時餘額最小就是m了,直接輸出就行了;
(2)當m>=5時,我們留出5元放到最後來買最貴的菜,然後把卡上的餘額盡可能的多花,這時候得到的餘額即為最小值,那麼問題來了,如何求出盡可能多的話出這剩下的m-5元呢?如果我們把m-5元看做乙個揹包的話,問題是不是會簡單一點呢?這時候每種菜的**就變成物品的重量了,至於物品的價值,仍然是每種菜的**,因為我們要用dp()陣列來求出m-5元中最多能花出的錢數,這樣問題就變為了01揹包問題。
#include #include #include using namespace std;
int main()
m-=5;
sort(p+1,p+1+n);
for(i=1;i=p[i];j--)
dp[j]=max(dp[j],dp[j-p[i]]+p[i]);
printf("%d\n",m+5-dp[m]-p[n]);
}return 0;
}
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種菜 每種菜可購買一...