POJ 1742 Coins DP 多重揹包

2022-09-03 05:30:10 字數 1061 閱讀 2009

有nn

種面值不同的硬幣,每種有c[i

]c[i

]個。求1到m

m有多少面值可以用這些硬幣湊成?

很明顯的完全揹包。。。

前面wa,t

le,r

e,ce

wa,t

le,r

e,ce

全是用二進位制拆分做的。。。後來實在沒辦法打了書上的方法。設f[

i]f[

i]為面值為i

i可否得到。那麼最基本的o(t

nm2)

o(tn

m2)肯定是過不了的。需要優化。設us

ed[i

]use

d[i]

表示面值湊到i

i的最小硬幣使用數,那麼我們就可以省掉一重迴圈,因為,可以用use

duse

d來進行最小答案的判斷。

最終答案為∑i=

1nf[

i]∑i

=1n​

f[i]

時間複雜度:o(t

nm)o

(tnm

)

#include

#include

using

namespace std;

int n,m,c[

101]

,a[101

],used[

100001

],sum;

bool f[

100001];

intmain()

} sum=0;

for(

int i=

1;i<=m;i++

) sum+

=f[i]

;printf

("%d\n"

,sum);}

}

POJ 1742多重揹包問題

include include include include includeusing namespace std define maxn 105 define maxl 100005 int weight maxn c maxn f maxl user maxl int main printf ...

poj 1742 Coins 多重揹包

題意很簡單,有n種硬幣,每種硬幣面額多大,有多少個,求可以構成m以內的面額有多少種。開始用的是普通的多重揹包的求法,裸裸的超時了,看了別人的 發現可以優化很多。用usea這個來儲存用來多少個a硬幣,避免的很多無用的計算。先貼以前超時的 include include int dp 100005 in...

poj 1742 多重揹包(單調佇列)

如題 又是這道題 第一種方法是二進位制拆分多重揹包 能過hdu2488 見我這一篇 第二種是為了減小時間複雜度,通過改變dp策略 能過poj1742 不能過杭電 這裡說第三種,多重揹包的0 vn 複雜度演算法。使用了單調佇列。這位大牛寫的很清楚 也就是找出狀態轉移方程中的重複狀態,然後將容量拆成v拆...