其实,在刚接触编程时候,对于贪心算法和动态规划的区别一直感觉比较模糊,今天就数硬币这道题,来和大家认识一下贪心算法和动态规划。
money块钱[1,3,4]
拿到这个问题,我们首先就会去想,大币值能顶几个小币值,那么我们尽量去取大的币值,不就能够取到最少的硬币数了吗?
6块,[1,3,4]硬币为例let money = 6;
let corn = [1, 3, 4];
function greedy(money, corn) {
let cnt = 0;
for (let i = corn.length - 1; i >= 0; i--) {
while (money >= corn[i]) {
money -= corn[i];
cnt++;
}
}
return cnt;
}
let ans = greedy(money, corn);
console.log("贪心算法", ans);
ans=3
4,然后3拿不下,然后连着拿两个1,一共是3个硬币3let dp = new Array(money + 1).fill(Infinity);dp数组dp[i]可以看成我在某个额值上取一个硬币,也就是dp[i-coin[j]]+1min,因为我们要找到最少的硬币数dp[i]的最佳值
i-coin[j]<i,所以dp[i-coin[j]]也是最佳值dp[i]就也是最佳值了dp[i] = min(dp[i], dp[i - coin[j]] + 1);
i - coin[j] >= 0,来保证dp[i]是存在的let money = 6;
let coin = [1, 3, 4];
function min(a, b) {
return a < b ? a : b;
}
function dynamic(money, coin) {
let cnt = 0;
let dp = new Array(money + 1).fill(Infinity);
for (let i = 0; i < coin.length; i++) {
dp[coin[i]] = 1;
}
for (let i = coin[0]; i <= money; i++) {
for (let j = 0; j < coin.length; j++) {
if (i - coin[j] >= 0) dp[i] = min(dp[i], dp[i - coin[j]] + 1);
}
}
return dp[money];
}
let ans = dynamic(money, coin);
console.log("动态规划", ans);
i=6的时候
dp[i]=Infinityj,分别是
j=0,dp[6-1]+1=>dp[5]+1=>…=>2+1=3j=1,dp[6-3]+1=>dp[3]+1=>…=>1+1=2j=2,dp[6-4]+1=>dp[2]+1=>…=>2+1=3TypeScript代码吧!let money:number = 6;
let coin:number[] = [1, 3, 4];
function greedy(money:number, coin:number[]) {
let cnt:number = 0;
for (let i = coin.length - 1; i >= 0; i--) {
while (money >= coin[i]) {
money -= coin[i];
cnt++;
}
}
return cnt;
}
let ans = greedy(money, coin);
console.log('贪心算法',ans);
let money:number = 6;
let coin:number[] = [1, 3, 4];
function min(a:number, b:number) {
return a < b ? a : b;
}
function dynamic(money:number, coin:number[]) {
let cnt = 0;
let dp = new Array(money + 1).fill(Infinity);
for (let i = 0; i < coin.length; i++) {
dp[coin[i]] = 1;
}
for (let i = coin[0]; i <= money; i++) {
for (let j = 0; j < coin.length; j++) {
if (i - coin[j] >= 0) dp[i] = min(dp[i], dp[i - coin[j]] + 1);
}
}
return dp[money];
}
let ans = dynamic(money, coin);
console.log("动态规划", ans);