一道算法题,请教一下

2020-09-06 20:40:45 +08:00
 salamanderMH

问题

有砝码 1g,2g,3g...100g,组成 100g 的重量有几种方式?
这道题应该可以用动态规划做,但一下子没想出来(太渣了) 写了一个回溯的算法,但效率太差了:

function counterweightWays(currentNum, allNum, leftWeight, tmpResult, result) {    
    if (currentNum > allNum) {        
        return    }    
    if (leftWeight == 0) {        
        result.push(Array.from(tmpResult))        
        return    
    }    
    const maxNum = Math.floor(leftWeight / currentNum)    
    for (let n = maxNum; n >= 0; n--) {        
        tmpResult.push(n)        
        counterweightWays(currentNum + 1, allNum, leftWeight - n * currentNum, tmpResult, result)        
        tmpResult.pop()    
    }
}
1133 次点击
所在节点    问与答
5 条回复
jmc891205
2020-09-06 21:24:25 +08:00
搜索一下零钱兑换问题
fishCatcher
2020-09-06 21:53:57 +08:00
// 设 dp[i]是组成 i 克的方法个数, 1 <= i <= n
for (int i = 1; i <= n; i++)
dp[i] = 1; // base case,直接拿 1 个 i 克的砝码即可
for (int i = 2; i <= n; i++)
for (int j = 1; j <= i / 2; j++)
dp[i] += dp[j] * dp[i - j];
return dp[n];
zhy0216
2020-09-06 21:55:15 +08:00
salamanderMH
2020-09-06 22:00:21 +08:00
salamanderMH
2020-09-07 09:09:59 +08:00
@zhy0216 哇,太强了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/704680

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX