1. 程式人生 > >ACM_寒冰王座(完全背包)

ACM_寒冰王座(完全背包)

bits rip end -s 現在 cin mem 整數 scrip

寒冰王座

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

不死族的巫妖王發工資拉,死亡騎士拿到一張N元的鈔票(記住,只有一張鈔票),為了防止自己在戰鬥中頻繁的死掉,他決定給自己買一些道具,於是他來到了地精商店前.

死亡騎士:"我要買道具!"

地精商人:"我們這裏有三種道具,血瓶150塊一個,魔法藥200塊一個,無敵藥水350塊一個."

死亡騎士:"好的,給我一個血瓶."

說完他掏出那張N元的大鈔遞給地精商人.

地精商人:"我忘了提醒你了,我們這裏沒有找客人錢的習慣的,多的錢我們都當小費收了的,嘿嘿."

死亡騎士:"......"

死亡騎士想,與其把錢當小費送個他還不如自己多買一點道具,反正以後都要買的,早點買了放在家裏也好,但是要盡量少讓他賺小費.

現在死亡騎士希望你能幫他計算一下,最少他要給地精商人多少小費.

Input:

輸入數據的第一行是一個整數T(1<=T<=100),代表測試數據的數量.然後是T行測試數據,每個測試數據只包含一個正整數N(1<=N<=10000),N代表死亡騎士手中鈔票的面值.

註意:地精商店只有題中描述的三種道具.

Output:

對於每組測試數據,請你輸出死亡騎士最少要浪費多少錢給地精商人作為小費.

Sample Input:

2
900
250

Sample Output:

0
50
解題思路:完全背包問題。此題共有三種道具,要求給出一張N元鈔票,自己盡量買多點道具,盡量少讓地精商人賺小費,由此可以想到完全背包問題。所謂完全背包,通常是有n種物品
(對應本題的‘道具‘)和一個容量為V(對應本題的‘N元鈔票‘)的背包,每種物品(道具)都有無限件可用。第i種物品(道具)的體積是w[i],價值(面值)是v[i]。求解買哪些道具裝入背包可使這些道具的體積總和W不超過背包容量(n元鈔票),且價值總和V最大。這樣地精商人小費就賺得少了。這裏的面值150、200、350就是相應的w[i]、v[i],體積最大的時候也就是價值最大的時候,因為體積最大W不會超過n,所以得到的最大價值dp[n]<=n元鈔票。這裏dp[i]表示當前(不超過背包體積)體積的最大價值。
狀態轉移方程:dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
AC代碼:
 1
#include<bits/stdc++.h> 2 using namespace std; 3 int dp[10005]; 4 const int v[3]={150,200,350},w[3]={150,200,350}; 5 int main() 6 { 7 int t,n; 8 cin>>t; 9 while(t--){ 10 memset(dp,0,sizeof(dp)); 11 cin>>n; 12 for(int i=0;i<3;++i){ //種數 13 for(int j=w[i];j<=n;++j) //價值從小到大枚舉 14 dp[j]=max(dp[j],dp[j-w[i]]+v[i]); 15 } 16 cout<<(n-dp[n])<<endl; 17 } 18 return 0; 19 }
杭電hdu1248與此題一樣,題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1248

ACM_寒冰王座(完全背包)