HDU-寒冰王座(多重揹包)

不死族的巫妖王發工資拉,死亡騎士拿到一張N元的鈔票(記住,只有一張鈔票),爲了防止自己在戰鬥中頻繁的死掉,他決定給自己買一些道具,於是他來到了地精商店前.
死亡騎士:“我要買道具!”
地精商人:“我們這裏有三種道具,血瓶150塊一個,魔法藥200塊一個,無敵藥水350塊一個.”
死亡騎士:“好的,給我一個血瓶.”
說完他掏出那張N元的大鈔遞給地精商人.
地精商人:“我忘了提醒你了,我們這裏沒有找客人錢的習慣的,多的錢我們都當小費收了的,嘿嘿.”
死亡騎士:"…"
死亡騎士想,與其把錢當小費送個他還不如自己多買一點道具,反正以後都要買的,早點買了放在家裏也好,但是要儘量少讓他賺小費.
現在死亡騎士希望你能幫他計算一下,最少他要給地精商人多少小費.

輸入

輸入數據的第一行是一個整數T(1<=T<=100),代表測試數據的數量.然後是T行測試數據,每個測試數據只包含一個正整數N(1<=N<=10000),N代表死亡騎士手中鈔票的面值. 注意:地精商店只有題中描述的三種道具.

輸出

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

輸入樣例

2
900
250

輸出樣例

0
50

代碼

完全揹包是在N種物品中選取若干件(同一種物品可多次選取)放在空間爲V的揹包裏,每種物品的體積爲C1,C2,…,Cn,與之相對應的價值爲W1,W2,…,Wn.求解怎麼裝物品可使揹包裏物品總價值最大。
通過轉化把多重揹包轉化爲01揹包。狀態表達式dp[j]=max(dp[j],dp[j-f[i]]+f[i]);

#include<bits/stdc++.h>
using namespace std;
int n,m,k,mixn;
int dp[11000]; 
int f[4]={150,200,350};
int main(){
	int t; 
	scanf("%d",&t);
    while(t--){
    	memset(dp,0,sizeof(dp));
    	scanf("%d",&n);
		for(int i=0;i<3;i++){
			for(int j=f[i];j<=n;j++){
				dp[j]=max(dp[j],dp[j-f[i]]+f[i]);
			}
		}
		printf("%d\n",n-dp[n]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章