百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

动态规划 从零钱问题开始说起 背包问题 Java

toyiye 2024-09-07 00:39 3 浏览 0 评论

动态规划问题, 寻找子问题,自下而上取思考。求dp[i], 就要先求dp[i-1], 看两者是不是有关系。

零钱问题: 求n = 10 , 那么 n = 9 可以先求出, 那么n = 8 可以先求出。然后从下到上取遍历。

背包问题:遍历两次、可以先遍历背包,可以先遍历物品。具体情况具体分析。

先把题目抽象为背包和物品。这里用两个题目举例分析。

物品

背包

dp[j]

递推公式

零钱coin

总金额

凑足总额为j所需钱币的最少个数为dp[j]

dp[j] = min(dp[j - coins[i]] + 1, dp[j])









完全平方数

总数n

凑足总数为j所需完全平方数的最少个数为dp[j]

dp[j] = min(dp[j - i*i] + 1, dp[j])












for(int i = 1; i< dp.length; i++){ //遍历背包,背包是总金额

for(int j = 0; j< coins.length; j++){ // 遍历物品

if(i>= coins[j] && dp[i - coins[j]] != amount +1){

dp[i] = Math.min(dp[i], dp[i-coins[j]] + 1);// 核心。求最小。为什么要加1 ,因为你拿出了一个物品,要加上这个物品的价值。这里是1;

    public int coinChange(int[] coins, int amount) {
        int dp[] = new int[amount+1];
        
        Arrays.fill(dp,amount+1);
        dp[0] = 0;//这里 写1 ,测试不通过
        for(int i = 1; i< dp.length; i++){    //遍历背包,背包是总金额
            for(int j = 0; j< coins.length; j++){ // 遍历物品
                if(i>= coins[j] &&  dp[i - coins[j]] != amount +1){
                    dp[i] = Math.min(dp[i], dp[i-coins[j]] + 1);
                }
               
            }
        }
        return dp[amount] == amount +1 ? -1 : dp[amount];
    }




和零钱问题1 一样

//背包是 n , 物品是平方数

//这里是求最值,排列数和组合数无关。

//看出每次dp[j]都要选最?的,所以?0下标的dp[i]?

// 定要初始为最?值,这样dp[j]在递推的时候才不会被初始值覆盖。

for(int i = 0; i<= n ; i++){//遍历背包

for(int j = 1; j*j < i ; j++){//遍历物品

dp[i] = Math.min(dp[i], dp[i-j*j] + 1);// 返回背包的结果


解法2, //遍历物品,再遍历背包

for(int i = 1 ; i*i <= n; i++){//遍历物品

for(int j = 1 ; j<= n ; j++){//再遍历背包

if(j - i*i >= 0){

dp[j] = Math.min (dp[j- i*i] + 1, dp[j]);//背包的值

class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n+1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        //背包是 n , 物品是平方数
        //这里是求最值,排列数和组合数无关。 
        //看出每次dp[j]都要选最?的,所以?0下标的dp[i]?
// 定要初始为最?值,这样dp[j]在递推的时候才不会被初始值覆盖。
        // for(int i = 0; i<= n ; i++){//遍历背包
        //     for(int j = 1; j*j < i ; j++){
        //         dp[i] = Math.min(dp[i], dp[i-j*j] + 1);
        //     }
        // }
        // return dp[n];


        //遍历物品,再遍历背包
        for(int i = 1 ; i*i <= n; i++){
            for(int j = 1 ; j<= n ; j++){//再遍历背包
                if(j - i*i >= 0){
                    dp[j] = Math.min (dp[j- i*i] + 1, dp[j]);  //j, 背包的值
                }
            }
        }
        return dp[n];
    }
}

零钱问题2 : 求组合数(和排列无关)

求组合数-------先外层for循环遍历物品(coins),内层for遍历背包(amount)

class Solution {
    public int change(int amount, int[] coins) {
        
        int[] dp = new int[amount + 1];
        dp[0] = 1;
        // 先外层for循环遍历物品(coins),内层for遍历背包(amount)
        for(int i = 0; i < coins.length; i++){ // 外层for循环遍历物品
            for(int j = coins[i]; j < amount +1; j++){ // 内层for遍历背包
                dp[j] += dp[j - coins[i]];  // 背包不同大小,自下而上累加
            }
        }
        return dp[amount];
    }
}


你,我加油:P

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码