動態規劃 硬幣問題

2021-10-24 17:13:20 字數 2317 閱讀 2419

整理的演算法模板合集:acm模板

問題描述

有n種硬幣,面值分別為v1,

v2,v

3,..

...v

nv _1,v_2,v_3,.....v_n

v1​,v2

​,v3

​,..

...v

n​,每種都有無限多

給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?

輸出硬幣數目的最小值和最大值。1<=n>=100, 0<=s<=10000,1<=vi<=s.

硬幣問題,實際上就是乙個完全揹包問題,但是要記錄最優子結構並輸出路徑。

乙個小trick就是我們使用記憶化搜尋的時候可以用引用變數表示dp陣列,這樣既可以修改又短方便寫。

我們在輸出完方案之後要及時break,防止多次輸出。

#include

#include

#include

#include

#define x first

#define y second

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n =

107, m =

5e3+

7, maxn =

1007

;const

int mod =

1e9+7;

const

int inf =

0x3f3f3f3f

;int n, m, t, s;

int a[n]

[n], f[n]

;int w[n]

;bool vis[n]

;int maxv[n]

, minv[n]

;intdp(

int s)

void

print_ans

(int

* d,

int s)

}int

main()

printf

("%d %d\n"

, maxv[s]

, minv[s]);

print_ans

(maxv, s)

;puts(""

);print_ans

(minv, s)

;return0;

}

典型的用空間換時間

#include

#include

#include

#include

#define x first

#define y second

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n =

107, m =

5e3+

7, maxn =

1007

;const

int mod =

1e9+7;

const

int inf =

0x3f3f3f3f

;int n, m, t, s;

int a[n]

[n], f[n]

;int w[n]

;bool vis[n]

;int maxv[n]

, minv[n]

;int coin_max[n]

, coin_min[n]

;void

print_ans

(int

* d,

int s)

}int

main()

if(maxv[i]

< maxv[i - w[j]]+

1)}printf

("%d %d\n"

, maxv[s]

, minv[s]);

//表示以s為起點的最優解

print_ans

(coin_max, s)

;puts(""

);print_ans

(coin_min, s)

;return0;

}

動態規劃 硬幣問題

這是乙個固定重點的最長路和最短路問題,可用動態規劃問題來求解 代表硬幣總值,n代表硬幣總數,v陣列儲存硬幣各個面值,d代表從i出發到結點0的路徑的最長路徑長度或最短路徑長度 vis代表是否訪問過該結點 int n,s,v maxn d maxn vis maxn int dpmax int s re...

動態規劃 硬幣問題

2013 07 11 03 17 5610人閱讀收藏 舉報 演算法和資料結構學習 79 最少硬幣問題 假設有3種不同的硬幣,幣值分別是coinvalue 每一種硬幣的數量是有限的,分別是coinnum 給定乙個數值target 18,找出一種硬幣數最少的方法,輸出最少的硬幣數。思路 動態規劃。問題定...

動態規劃 硬幣問題

問題描述 輸入總金額n,硬幣不同價值的種類m,m種硬幣的面值 例如 15 6 1 2 7 8 12 50 輸出湊成n最少的硬幣數 1 貪心演算法 每次都選擇面值最大的。問題在於,求出來的並不是最優解,上例中,用貪心解出來的結果為3 1,2,12 而實際為2 7,8 include includeus...