zoukankan      html  css  js  c++  java
  • 算法题(动态规划)

    91. 最小调整代价


    给一个整数数组,调整每个数的大小,使得相邻的两个数的差不大于一个给定的整数target,
    调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。

    样例 1:

    输入:  [1,4,2,3], target=1
    输出:  2
    

    样例 2:

    输入:  [3,5,4,7], target=2
    输出:  1
    

    '''

    class Solution {
        public:
        /**
         * @param A: An integer array.
         * @param target: An integer.
         */
        int MinAdjustmentCost(vector<int> A, int target) {
            // write your code here
            int array1[101], array2[101], *p = array1, *q = array2;
            for (int i = 1; i <= 100; ++i) p[i] = abs(A[0] - i);
            for (int i = 1; i < A.size(); ++i) {
                int minval[101], l = 0, r = -1;
                for (int j = 1; j <= target && j <= 100; ++j) {
                    while (r >= l && p[minval[r]] >= p[j]) --r;
                    minval[++r] = j;
                }
                for (int j = 1; j <= 100; ++j) {
                    if (j + target <= 100) {
                        while (r >= l && p[minval[r]] >= p[j + target]) --r;
                        minval[++r] = j + target;
                    }
                    if (minval[l] < j - target) ++l;
                    q[j] = abs(A[i] - j) + p[minval[l]];
                }
                swap(p, q);
            }
            int ans = p[1];
            for (int i = 2; i <= 100; ++i) {
                if (ans > p[i]) ans = p[i];
            }
            return ans;
        }
    };
    

    '''

    92. 背包问题


    描述

    在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]

    样例 1:

    输入:  [3,4,8,5], backpack size=10
    输出:  9
    

    样例 2:

    输入:  [3,5,4,7], target=2
    输出:  1
    

    '''

    class Solution {
    public:
        /**
         * @param m: An integer m denotes the size of a backpack
         * @param A: Given n items with size A[i]
         * @return: The maximum size
         */
        int backPack(int m, vector<int> &A) {
            // write your code here
            int n = A.size();
            bool dp[m + 1];
            dp[0] = true;
            for(int i = 1; i <= m; i++){
                dp[i] = false;
            }
            for(int i = 1; i <= n; i++){
                for(int j = m; j >= A[i - 1]; j--){
                    dp[j] = dp[j] || dp[j - A[i - 1]];
                }
            }
            for(int i = m; i >= 0; i--){
                if(dp[i]){
                    return i;
                }
            }
        }
    };
    

    '''

    125. 背包问题 II


    有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.问最多能装入背包的总价值是多大?

    • A[i], V[i], n, m 均为整数
    • 你不能将物品进行切分
    • 你所挑选的要装入背包的物品的总大小不能超过 m
    • 每个物品只能取一次
      样例 1:

    输入: m = 10, A = [2, 3, 5, 7], V = [1, 5, 2, 4]
    输出: 9
    解释: 装入 A[1] 和 A[3] 可以得到最大价值, V[1] + V[3] = 9
    样例 2:

    输入: m = 10, A = [2, 3, 8], V = [2, 5, 8]
    输出: 10
    解释: 装入 A[0] 和 A[2] 可以得到最大价值, V[0] + V[2] = 10


    class Solution {
        public:
            /**
             * @param m: An integer m denotes the size of a backpack
             * @param A: Given n items with size A[i]
             * @param V: Given n items with value V[i]
             * @return: The maximum value
             */
            int backPackII(int m, vector<int> &A, vector<int> &V) {
                // write your code here
                int n=A.size();
                if(n==0){
                    return 0;
                }
    
                vector<vector<int>> dp(n+1, vector<int>(m+1));
                for (int i = 0; i <= n; i++) {
                    for (int j = 0; j <= m; j++) {
                        if (i == 0 || j == 0) {
                            dp[i][j] = 0;
                        } 
                        else if (A[i - 1] > j) {
                            dp[i][j] = dp[(i - 1)][j];
                        } 
                        else {
                            dp[i][j] = max(dp[(i - 1)][j], dp[(i - 1)][j - A[i -    1]]    + V[i - 1]);
                        }
                    }
                }
                return dp[n][m];
            }
        };
    

    562. 背包问题 IV


    给出 n 个物品, 以及一个数组, nums[i]代表第i个物品的大小, 保证大小均为正数并且没有重复, 正整数 target 表示背包的大小, 找到能填满背包的方案数。
    每一个物品可以使用无数次

    样例1

    输入: nums = [2,3,6,7] 和 target = 7
    输出: 2
    解释:
    方案有:
    [7]
    [2, 2, 3]
    样例2

    输入: nums = [2,3,4,5] 和 target = 7
    输出: 3
    解释:
    方案有:
    [2, 5]
    [3, 4]
    [2, 2, 3]

    class Solution {
        public:
            /**
             * @param nums an integer array and all positive numbers, no    duplicates
             * @param target an integer
             * @return an integer
             */
            int backPackIV(vector<int>& nums, int target) {
                // Write your code here
                int n = nums.size();
                vector<int> dp(target + 1);
                dp[0] = 1;
                for (int x : nums) {
                    for (int j = x; j <= target; ++j) {
                        dp[j] += dp[j - x];
                    }
                }
                return dp[target];
            }
        };
    

    563. 背包问题 V


    给出 n 个物品, 以及一个数组, nums[i] 代表第i个物品的大小, 保证大小均为正数, 正整数 target 表示背包的大小, 找到能填满背包的方案数。
    每一个物品只能使用一次

    给出候选物品集合 [1,2,3,3,7] 以及 target 7

    结果的集合为:
    [7]
    [1,3,3]
    返回 2

    class Solution {
        public:
            /**
             * @param nums: an integer array and all positive numbers
             * @param target: An integer
             * @return: An integer
             */
            int backPackV(vector<int>& nums, int target) {
                // Write your code here
                vector<int> dp(target + 1);
                dp[0] = 1;
                for (auto a : nums) {
                    for (int i = target; i >= a; --i) {
                        dp[i] += dp[i - a];
                    }
                }
                return dp.back();
            }
        };
  • 相关阅读:
    oracle删除用户及其名下对象
    CENTOS7设置显示中文
    hadoop安装
    linux使用flock文件锁解决crontab冲突问题
    Hive On Spark和SparkSQL
    MapReduce和Tez对比
    安装python的redis模块
    拷贝一个用户下的所有表和数据到另外一个库
    java学习笔记10--泛型总结
    java学习笔记9--内部类总结
  • 原文地址:https://www.cnblogs.com/archmage01/p/11507775.html
Copyright © 2011-2022 走看看