找零問題 動態規劃

2021-06-22 03:42:57 字數 878 閱讀 3245

當乙個幣值組合用貪婪演算法不能找出最優解的時候,比如對於 1,2, 5 ,7,10。如果找14元錢的話,貪婪演算法答案是10,2,2,但最優解為7,7。

那麼利用動態規劃就能找出最優解,只是時間和空間複雜度都很高,o(nm)。

首先寫出狀態方程

| ----- f(i-1,x) ,  如果v[i]>x   即當如果當前選擇的幣值大於找零的值

f(i,x)=|

| -----  min(f(i-1,x) ,f(i,x-v[i])+1)  即,從不使用第i個幣值和至少使用1個第i個幣值中選擇最小的

其實這個有點想完全揹包問題,只是揹包是選擇最大,而找零是選擇最小,對於完全揹包問題,可以看看這篇博文

只要把狀態方程寫出來,那麼程式就很容易了

public class chargemake ;  //公升序排列

int charge = 142;

charge(values, charge);

} private static void charge(int values, int charge)

for (int i = 1; i < charge + 1; i++) else

} for (int i = 1; i < value + 1; i++) else

}} int mincoin = matrix[value][charge];

/** 如果最小幣值等於max,則說明當前幣值組合不能找出該零錢

*/if (mincoin == max) else

if(matrix[i][j - values[i - 1]] + 1==matrix[i][j])

else

}} }

}

硬幣找零問題(動態規劃)

給定指定的硬幣種類,面值為 1,3,5 在此具體化些 給定所找零的錢數 sum,給出最少的硬幣找零數,每個種類的硬幣無限使用。看到這問題,當時我想到用貪心演算法來求解,最後求解方案因為巧合對了,後來在網上看到動態規劃的題目,才知道貪心演算法得不到最優解,比如 給定 面值為 1,3,4,給定找零數為 ...

硬幣找零問題 動態規劃問題

看到了 這文章,由於我不太懂他的 所以我按他的題和思路,寫了 思路我就不寫了,就是動態規劃的思路,先保證區域性最優,再慢慢向全區域性最優 include include include include using namespace std const int m 100 int coinsum m...

IT筆試 動態規劃 貨幣找零問題

題目 你要出去旅遊,有n元的預算住酒店,有m家酒店供你挑選,這些酒店都有 x。需要你正好花完這n元住酒店 不能多,也不能少 最少能住幾晚?返回最少住的天數,沒有匹配的返回 1 比如你有1000元,所有酒店都是大於1000的,則返回 1 比如你有1000元,有1家1000元的,有1家300,有1家70...