poj1742 動態規劃 經典多重揹包

2021-07-04 07:19:38 字數 847 閱讀 9776

有n種不同面值的硬幣,面值各為a1,a2,a3。。an,數量各為c1,c2,c3,,,,,cn。給定數m,問這些硬幣能組成小於等於m的數中的哪些數,輸出這些數的數目。

開始想的是從1到m判斷每個數是不是能被這些硬幣組成,但是判斷每個硬幣的數量的時候出現了問題,難以統計每種硬幣使用的數目,

後來去網上搜了搜,發現可以以每種硬幣為開始,把每種硬幣能組成的數記錄下來,這樣在統計每種硬幣數目的時候就好統計了。借鑑了別人的思路。

#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

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

using namespace std;

typedef long long ll;

typedef pairpii;

inline int in()

int value[110];

int num[110];

int cnt[100010];

bool dp[100010];

int main()

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

int ans=0;

dp[0]=1;

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

{mem(cnt,0);//換一種硬幣之後cnt陣列清零

for(int j=value[i];j<=m;j++) //從當前硬幣開始看它能組成哪些數

{if(!dp[j] && dp[j-value[i]] && cnt[j-value[i]]

POJ1742 動態規劃 多重揹包

題意 問多重部分和能否恰好等於m。思路 dp i j 用前i種面額硬幣湊成j後,第i種硬幣最多剩下的個數,若湊不成則為 1.可優化空間複雜度。反思 想不出應該如此定義dp陣列。include using namespace std int a 100 10 int c 100 10 int dp 1...

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 多重揹包(單調佇列)

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