動態規劃 多重揹包 hdu2844 coins

2021-08-03 20:33:46 字數 1461 閱讀 3148

01揹包:每種物體只有1個,可選擇取或不取

完全揹包:每種物體有無數個(當每種物體 重量w * 個數 c >= 揹包容量 v 時,可視為完全揹包)

多重揹包:每種物體有c[ i ]個

將個數c拆分成1,2,4,...,2^(k - 1),c - (2 ^ k - 1)

拆分為二進位制則可表示1到c任意的數字。

while ( int x) //x為該種物品的總個數

int t = 1;

while (x >= t)

if ( x )

hdu2844

有n種硬幣,面值為a [ i ],個數為c [ i ].手錶最多m元,求硬幣最多能表示多少種**(1..m)

揹包容量m。多重揹包。每種硬幣的重量(費用)、價值均為a [ i ]。

轉化為01揹包後,

for i = 1 to cnt

for j = m to a[ i ]

f [ j ] = max( f [ j ] , f [ j - a [ i ]] + a [ i ] );

最後的 f [ j ]即為考慮了所有的硬幣後,當揹包的容量為j時的最大價值。

因為揹包容量即想要湊出的錢,for i = 1 to m,當f [ i ] = i 時,即所有硬幣可湊出**i,計數 +1。

#include 

#include 

#include 

#include 

#include 

using

namespace

std;

const

intmaxn = 

105;

const

intmaxm = 

1e5+ 5;

inta[maxn

],b[

maxn];

intf[

maxm];

vector

<

int> v;

void

change(

intx,

intper)

if(x) }

intmain()

v.clear

();

memset(f

, 0, sizeof(f

));

intans = 0;

for(int

i = 

0; i < n; i ++)

for(int

i = 

0; i < n; i ++)

for(int

i = 

0; i < v.

size

(); i ++) }

for(int

i = 

1; i <= m; i ++) }

printf

("%d\n"

,ans); }

return0;

}

hdu 2844 多重揹包)

思路 其實就是多重揹包的應用,只是這裡價值和重量是相等的,因此最後計數是要計價值和重量相等的個數 1 include2 include3 const int n 100010 4 using namespace std 5int n,m 67 struct nodenode n 100 11 int...

hdu2844 多重揹包

讀題能力還是不行,英文水平不夠,只能靠翻譯 華沙人用硬幣。他們有價值a1 a2 a3的硬幣 一枚銀幣。一天,希比克斯開啟錢包,發現裡面有一些硬幣。他決定在附近的一家商店買一塊非常好的手錶。他想支付確切的 不找零 他知道 不會超過m,但他不知道手錶的確切 你要寫乙個程式,它讀取n,m,a1,a2,a3...

hdu 2844 多重揹包

真爽啊 打完一把絕對carry的亞索 來做這題 一發ac touch me 這題 反正資料很大 不用二進位制拆分 肯定tle的 反正 二進位制拆分 很簡單的啊 不會的 現在看我 學下就好了。1 include 2 include 3 using namespace std 45 const int ...