DAG上的動態規劃 硬幣問題

2021-07-03 09:09:19 字數 1251 閱讀 2829

題目:有n種硬幣,面值分別為v1,v2,...vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值!

分析:我們把每種面值看作乙個點!表示「還需要湊足的面值」,初始狀態為s,目標狀態為0。那麼若當前狀態在i,每使用乙個硬幣j,狀態便轉移到i-vj。

#include #include #define max(a,b) (a>b?a:b)

const int maxn = 10000 +10 ;

const int inf = 1<<30 ;

using namespace std;

int vis[maxn]  , d[maxn] ;   // vis標記是否訪問 , d臨時代替maxv ,minv陣列

int maxv[maxn] , minv[maxn] ;// maxv存硬幣最大數 , minv 存硬幣最少數

int max_coin[maxn] , min_coin[maxn] ;  //  存路徑

int v[maxn] ;                          // 硬幣價值

int n , s ;

///int dpmaxx(int s)

}return ans ;

}int dpminn( int s)

}}int dpmax( int s)

return ans ;

}int dpmin( int s)

return ans ;

}///

///輸出字典序最小的方案     方法1

void print_ans( int* d , int s)

}}void print_ans2( int* d , int s)

}int main()

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

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

if( maxv[i] < maxv[i - v[j]] + 1 ) //}

}}

printf("%d %d\n", minv[s] , maxv[s] ) ;

print_ans(maxv,s) ;

print_ans(minv,s) ;

///print_ans2(maxv,s) ;

print_ans2(minv,s) ;

///}

return  0 ;

}

DAG上的動態規劃 硬幣問題

問題描述 有n種硬幣,面值分別為v1,v2,v3.vn,每種硬幣有無限多,給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值,並且輸出各自的選取方案 如果有多種方案,則輸出硬幣編號字典序較小的方案,輸出每種選取方案的面值 分析 本質上市乙個dag上的路徑問題,我們...

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