DAG上的動態規劃 硬幣問題

2021-07-28 23:09:35 字數 904 閱讀 4220

問題描述:

有n種硬幣,面值分別為v1,v2,v3...vn,每種硬幣有無限多,給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值,並且輸出各自的選取方案(如果有多種方案,則輸出硬幣編號字典序較小的方案,輸出每種選取方案的面值)。

分析:本質上市乙個dag上的路徑問題,我們把每種面值看做乙個點,表示還需湊足的面值,則初始狀態為0,目標狀態為0,若當前在i,則每使用一枚硬幣j,狀態轉移到i-vj。

#include #include using namespace std;

const int maxn = 10000;

const int inf = 0x3f3f3f3f;

int n, s, v[maxn], d[maxn], vis[maxn];

int dpmax(int s)

return ans;

}int dpmin(int s)

return ans;

}void print_ans(int s)

}}int main()

vis[0] = 1;

d[0] = 0;

cout << dpmax(s) << endl;

print_ans(s);

printf("\n");

memset(vis, 0, sizeof(vis));

vis[0] = 1;

d[0] = 0;

cout << dpmin(s)<< endl;

print_ans(s);

printf("\n");

return 0;}/*

3 12

3 4 5

*/

DAG上的動態規劃 硬幣問題

題目 有n種硬幣,面值分別為v1,v2,vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值!分析 我們把每種面值看作乙個點!表示 還需要湊足的面值 初始狀態為s,目標狀態為0。那麼若當前狀態在i,每使用乙個硬幣j,狀態便轉移到i vj。inc...

DAG上的動態規劃 硬幣問題

題意 有n種硬幣,面值分別為v1,v2,vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值。分析 我們把每種面值看作乙個點!表示 還需要湊足的面值 初始狀態為s,目標狀態為0。那麼若當前狀態在i,每使用乙個硬幣j,狀態便轉移到i vj。inc...

DAG上的動態規劃之硬幣問題

有n種硬幣,面值分別為 v1,v2,vn。每種都有無限多。給定非負整數s,問可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值。1 n 100,0 s 10000,1 vi s 思路 就是可以把終點看為0,輸入的數值為s,就轉化成了定終點的問題,那麼轉移方程其實就是ans max...