美文网首页
lintcode-k数和

lintcode-k数和

作者: 鬼谷神奇 | 来源:发表于2016-06-01 15:52 被阅读396次
    • 动态规划(确定0-1背包、完全背包、多重背包)
      • 0-1背包:每个元素要么出现,要么不出现,逆序遍历,数组定义为:前i个元素在不超过体积V的前提下,所能达到的最大值,初始值均为0
      • 完全背包:每个元素可以出现无数次,顺序遍历,数组定义为:前i个元素体积刚好为V的情况下,所能达到的最大价值,初始值为不存在(无穷),dp[0] = 0
      • 多重背包:通过拆分,转换为0-1背包
    • 注意点
      • 所有数组元素都要有初始值,全为0的情况特殊考虑
      • 多维数组优化
    //0-1背包
    class Solution {
    public:
        /**
         * @param A: an integer array.
         * @param k: a positive integer (k <= length(A))
         * @param target: a integer
         * @return an integer
         */
        int kSum(vector<int> A, int k, int target) {
             if(A.size() < k || k == 0)
                return 0;
    
            int dp[k+1][target+1];
            
            for(int i = 0; i <= k; ++i) {
                for(int j = 0; j <= target; ++j) {
                    dp[i][j] = 0;
                }
            }
            
            dp[0][0] = 1;
            
            for(int i = 0; i < A.size(); ++i) {
                for(int j = k; j >= 1; --j) {
                    for(int s = target; s >= A[i]; --s) {
                        dp[j][s] = dp[j-1][s-A[i]] + dp[j][s];
                    }
                }
            }
            
            return dp[k][target];
        }
    };
    

    相关文章

      网友评论

          本文标题:lintcode-k数和

          本文链接:https://www.haomeiwen.com/subject/exphdttx.html