DP經典應用(五)硬幣問題

2021-07-30 07:38:56 字數 725 閱讀 2946

問題描述:

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

分析:

按照解決動態規劃的前3個步驟我們進行分析:

#include

#include

#include

using

namespace

std;

const

int maxn = 100+5;

const

int inf = 100000000;

int v[maxn],maxv[maxn],minv[maxn];

int n,s;

/*列印解*/

void print_ans(int* d,int s)

}}int main()

minv[0] = maxv[0] = 0;

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

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

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

print_ans(minv,s);

printf("\n");

print_ans(maxv,s);

return

0;}

注意列印最優解時要及時break;

DP 硬幣問題

動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解將由上一次子問題的解推出。使用動態規劃來解題只需要多項式時間複雜度,因此它比回溯法 暴力法等要快許多。動態規劃也是面試筆試題中的乙個考查重點,當閱讀乙個題目並且開始嘗試解決它時,首先看一下它的限制。如果要求在多項式時間內解決,那麼...

硬幣問題(DP)

題目 有n種硬幣,面值分別為v1,v2,vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值!狀態 d i 表示i 元最少要換多少個硬幣,那麼我們便要求d s 的值 狀態如何轉移 i元換零錢v j i v j 後狀態變為 d i v j 狀態選取 選d...

dp 最少硬幣問題

問題描述 設有n 種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣 來找錢。可以使用的各種面值的硬幣個數存於陣列coins 1 n 中。對任意錢數0 m 20001,設計乙個用最少硬幣找錢m的方法。程式設計任務 對於給定的1 n 10,硬幣面值陣列t和可以使用的各種面值的硬...