動態規劃-和為k的組合數
阿新 • • 發佈:2021-08-20
第一行:手中金錢為money,商品數量為n
第二行:商品的價格表例如[3, 7, 5, 10, 5]
問:選擇某些商品,使得價格正好為money(商品不可重複選擇,價格相同的算不同商品);如果沒有,則返回-1
剛開始用了回溯法,傻逼了;後來想到了動態規劃
public int solve(int[] prices, int target) { /** * dp[i][j]:可選商品為前i個時,湊出總價為j的組合數 * 求dp[n][target] */ int n = prices.length;int[][] dp = new int[n+1][target+1]; // 初始化,和為0的組合數為0 for (int i = 0; i <= n; i++) dp[i][0] = 1; for (int i = 1; i <= n; i++) { for (int j = 1; j <= target; j++) { if (prices[i-1] <= j) { // 第i個商品的價格小於等於當前總價,可以買/也可以不買 dp[i][j]= dp[i-1][j-prices[i-1]] + dp[i-1][j]; } else { // 第i個商品的價格大於當前總價,不能買 dp[i][j] = dp[i-1][j]; } } } return dp[n][target]; }
作者:Ryanjie
出處:http://www.cnblogs.com/ryanjan/
本文版權歸作者和部落格園所有,歡迎轉載。轉載請在留言板處留言給我,且在文章標明原文連結,謝謝!
如果您覺得本篇博文對您有所收穫,覺得我還算用心,請點選右下角的 [推薦],謝謝!