POJ1276 多重揹包

2021-09-02 04:32:15 字數 961 閱讀 3852

說到揹包問題,都少不了網上很出名的揹包九講。我也是看了那個以後才知道怎麼做的。

多重揹包:就是在0 1揹包的基礎上,有的物品可能有多個,問你怎麼選才能使總價值最大。

我們最容易想到的是把相同的物品分開,比如說有n個a1物品 就將它分成 a1 a2 a3 ...an 然後再用01揹包的方法去解決。不過在此題中,重複的物品可能有很多個,所以這樣會超時。

在揹包九講中提出了一種方法:若某物品n[i]個 ,那麼我們得到一串係數1 2 4  ...2 ^(k-1) ,n[i]-2^k+1 其中k為滿足n[i]-2^k+1>0的最大整數,比如13拆成1 2 4 6 ,將這種物品分成4個物品,每個物品的價值和重量均在原基礎上分別乘以得到的係數。

這種分解方法比原來的方法有很大的改進

下面是**

#includeusing namespace std;

#define maxsize 100010

#define max(a,b) (a>b?a:b)

int cash,n;

int tn;

int num[1010];

int d[1010];

int w[10010];

int dp2[maxsize];

//揹包九講

int getpow(int p)

int getk(int ni)

return old;

}void fenjie()

rate=num[i]-getpow(k)+1;

w[tn++]=rate*d[i]; }}

int slove()}}

return dp2[cash];

}int main()

//拆開

fenjie();

//揹包

printf("%d\n",slove());

}return 0;

}

poj1276 多重揹包

題意 取款機的問題 有 n 種錢 每種錢有 v i 的價值 每種錢有 w i 張 問給定要取得錢 cash 之後能從取款機最多取多少錢 理解 多重揹包 直接套模板 遞推式 dp i max dp i dp i mul v i mul v i 其中的值根據 定義 如下 include include ...

POJ 1276 多重揹包問題

題目在 題目大意是說,我現在要從atm中取錢,m atm裡面有若干種貨幣,每一種都有對應的貨幣面額和張數。問現在atm能夠取出來的 小於等於m的最大金額。若將m理解為揹包重量,而每種貨幣的面額理解成 value,貨幣的面額同樣理解成重量,那麼這個問題就是乙個多重揹包問題。多重揹包問題可以轉換成完全揹...

dp之多重揹包poj1276

題意 有現今cash,和n種錢幣,每種錢幣有ni個,價值為di,求各種錢幣組成的不超過cash的最大錢數.思路 二進位制拆分轉化為01揹包,或者轉化為完全揹包都是可以的。反思 這個題目我wa兩次,是應為我把判斷cash 0 n 0放得太前,以致於後面的資料木有輸入 wa include includ...