問題描述:
題目:有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和可以使用的各種面值的硬...