1. 程式人生 > 其它 >動態規劃-和為k的組合數

動態規劃-和為k的組合數

第一行:手中金錢為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/

本文版權歸作者和部落格園所有,歡迎轉載。轉載請在留言板處留言給我,且在文章標明原文連結,謝謝!

如果您覺得本篇博文對您有所收穫,覺得我還算用心,請點選右下角的 [推薦],謝謝!