poj1742 Coins 多重揹包優化DP

2021-08-19 17:26:45 字數 1157 閱讀 2946

給定n個物品,第i個物品價值為a[i],數量為c[i],求可以組成的小於m的價值的個數。

好像n,m的範圍比較大,暴力跑二進位制優化的多重揹包是可以卡過去的。但是有一種o(

nm) o(n

m)

的方法來優化多重揹包,即在列舉體積的時候我們按照完全揹包來順序列舉,完全揹包裡的列舉體積是可以滿足重複選擇同意物品的,但是由於每一種物品有自己的數量,所以我們對於每一種體積都記錄剩餘第i種物品的最大數量,這樣就可滿足不超出物品數量的限制了。

注意在用滾動陣列的時候要把上一層的狀態先全部轉移到第i層才可以開始dp。

/*********************=

* author : ylsoi

* problem : coins

* algorithm : dp

* time : 2018.5.5

* ***************===*/

#include

#include

#include

#include

#include

#include

using

namespace

std;

void file()

#define rep(i,a,b) for(register int i=a;i<=b;++i)

#define drep(i,a,b) for(register int i=a;i>=b;--i)

#define mrep(i,x) for(register int i=beg[x];i;i=e[i].last)

#define mem(a) memset(a,0,sizeof(a))

#define ll long long

#define inf int_max

const

int maxn=100+10;

const

int maxm=1e5+10;

int n,m,a[maxn],c[maxn],dp[maxm];

int main()

}int ans=0;

rep(i,1,m)ans+=(dp[i]>=0);

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

}return

0;}

poj 1742 Coins 多重揹包

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

POJ 1742 Coins 多重揹包DP

題意 有n種面額的硬幣。面額 個數分別為a i c i,求最多能搭配出幾種不超過m的金額?思路 dp j 就是總數為j的價值是否已經有了這種方法,如果現在沒有,那麼我們就乙個個硬幣去嘗試直到有,這種價值方法有了的話,那麼就是總方法數加1。多重揹包可行性問題 傳統多重揹包三重迴圈會超時,因為只考慮是否...

poj1742 Coins(多重揹包計數 優化)

題意 有n種硬幣,每種的價值為a i 數量為c i 問任意組合這些硬幣,能組合出1到m中的多少種 資料範圍 n 100,m 1e5,a i 1e5,c i 1e3 解法 容易想到令d i j 表示前i種硬幣能否組成j,可以用滾動陣列忽略掉第一維陣列空間 但是如果直接計數的話複雜度為o n m max...