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