hdu 2844 混合揹包 揹包dp

2022-08-16 09:09:07 字數 1111 閱讀 6450

題意:有n種紙幣面額(a1,a2,...an),每種面額對應有(c1,c2,...cn)張。問這些錢能拼成1-m中多少種值。

題解:揹包dp問題。若ci=1,是01揹包,若ci*ai>=m則是完全揹包,否則是多重揹包。(詳見《揹包九講》)

先複習一下三種簡單揹包形式:

01揹包(f[v] ← max ):

完全揹包(f[i, v] = max(f[i − 1, v], f[i, v −ci] +wi)):

多重揹包(利用二進位制思想轉化為01揹包):

利用三種揹包形式就可以輕鬆解決此題:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

int f[100005];9

int c[105],a[105

];10

intn,m;

1112

void zeroonepack(int w,int

v)13

1718

void completepack(int w,int

v)19

2324

void multiplepack(int w,int v,int

c)25

32 zeroonepack(c*w,c*v);33}

3435

intmain()

3651

int ans=0;52

for(int i=1;i<=m;i++)

53if(f[i]==i) ans++;

54 printf("

%d\n

",ans);55}

56return0;

57 }

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 ...