动态规划(最少硬币找零、01背包问题)

最少硬币找零问题

function change(coins,total){
    let m = coins.length;
    let n = total
    let res = new Array(m+1).fill(1).map(()=>(new Array(n+1).fill(1)))
    for(let i=0;i<=n;i++){
        res[0][i]= Infinity //为动态规划创造初始条件
    }
    for(let i=1;i<=m;i++){
        res[i][0] = 0 //为动态规划创造初始条件
    }
    for(let i=1;i<=m;i++){
        for(let j=1;j<=n;j++){
            let coin = coins[i-1]
            if(j>=coin){
                res[i][j] = Math.min(res[i-1][j],res[i][j-coin]+1)
            }else{
                res[i][j] = res[i-1][j]
            }
        }
    }
    return res
}
function findVslues(res,coins){
    let p = res.length-1
    let q = res[0].length-1
    let ans = []
    while(p>0&&q>0){
        if(res[p][q]==res[p-1][q]){
            p--
        }else{
            ans.push(coins[p-1])
            q = q-coins[p-1]
        }
    }
    return ans
  }

  let coins = [1,3,4]
  let total = 6
  let res = change(coins,total)
  let ans = findVslues(res,coins)
  console.log(res)
  console.log(ans)

01背包

//0-1背包问题
function Bag(capacity,weights,values,n){
    let res = new Array(n+1).fill(0).map(()=>(new Array(capacity+1).fill(0)));
    for(let i=1;i<=n;i++){
        for(let j=1;j<=capacity;j++){
            if(j<weights[i-1]){
                res[i][j] = res[i-1][j]
            }else{
                res[i][j] = Math.max(values[i-1]+res[i-1][j-weights[i-1]],res[i-1][j])
            }
        }
    }
    return res
}
function findValues(res,weights,values){
    let ans = []
    let m = res.length-1;
    let n = res[0].length-1;
    while(m>0&&n>0){
        if(res[m][n]===res[m-1][n]){
            m--
        }else{
            let t = "第"+(m-1)+"个物品"+"重量是"+weights[m-1]+"价值是"+values[m-1]
            ans.push(t)
            
            n = n-res[m][n]
            
        }
    }
    return ans
}
const values = [3,4,5],
weights = [2,3,4],
capacity = 5,
n = values.length;
let res = Bag(capacity,weights,values,n)
let ans = findValues(res,weights,values)
console.log(res)
console.log(ans)```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值