算法刷题-动态规划3(未完待续---------

算法刷题-动态规划3)

01背包问题

一篇文章吃透背包问题
大佬讲解什么是背包问题

问题分析:

面对这么多的物品,

选择一个个地来装入背包,背包的承重量不断地增加,二维数组中,列为物品i,行为背包的承重量)。

当物品 i 的重量大于背包当前的总承重时,该物品不能放入背包;

当物品 i 的重量小于背包的总承重时,我们就要进行对比,前面 i - 1个物品所带来的价值和现在要取出背包中

的一部分物品用来存放物品i带来的价值,哪个更大?(取出多少呢,当然是刚好能放下物品 i 的重量,即wi),

把更大的那个价值对当前背包价值进行更新。


  • arr i j = max(arr i - 1 j , arr i - 1 j - w\[ i ] + v i )
clike 复制代码
for(int i=1;i<=n;i++)//物品i 
{
	for(int j=1;j<=c;j++)//重量j 
	{
		if(j>=w[i])
		{
			arr[i][j]=max(arr[i-1][j],arr[i-1][j-w[i]]+v[i]);	
		}
		else arr[i][j]=arr[i-1][j];
	}
}

public static int knapsack(int[] C, int[] W, int V, int N) {
    // 初始化dp数组,dp[i][j]表示前i个物品,背包容量为j时的最大价值
    int[][] dp = new int[N + 1][V + 1];
    
    // 当背包容量为0时,无论有多少物品,最大价值都为0
    for (int i = 0; i <= N; i++) {
        dp[i][0] = 0;
    }
    
    // 当没有物品可选时,无论背包容量有多少,最大价值都为0
    for (int j = 0; j <= V; j++) {
        dp[0][j] = 0;
    }
 
    // 填充dp数组,从前往后遍历每个物品,从小到大遍历背包容量
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= V; j++) {
            // 如果当前物品的重量小于等于背包容量,可以考虑将其放入背包
            if (j >= W[i - 1]) {
                // 如果放入当前物品,可以得到的最大价值比不放入当前物品的最大价值更高,则放入当前物品
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - W[i - 1]] + C[i - 1]);
            } else {
                // 如果当前物品的重量大于背包容量,无法放入背包,最大价值等于上一个物品的最大价值  
                dp[i][j] = dp[i - 1][j];  
            }
        }
    }
 
    // 返回最大价值,即dp[N][V]  
    return dp[N][V];  
}

分割等和子集

(待回顾和复习)美好的一天从每日一题开死

题目讲解

clike 复制代码
class Solution {
    //看不懂先去看二维数组解法
    public boolean canPartition(int[] nums) {
        int len=nums.length;  
        int sum=0;  
        for(int i=0;i<len;i++){  
            sum+=nums[i];  
        }
        if(sum%2!=0) return false;  
        //背包容量为总和的一半  
        int target=sum/2;  
        //dp[j]:容量为j时可放入物品的最大价值  
        int[] dp=new int[target+1];  
        for(int i=0;i<len;i++){  
            for(int j=target;j>=nums[i];j--){  
                dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);  
            }
        }
        return dp[target]==target;  
    }
}

最后一块石头的重量

相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark2 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法