动态规划入门01背包

简介: 基本思路:1.n物品个数,m为背包体积,使用w[i]记录权值,v[i]记录体积,f[i][j]记录选择前i个物体,在不超过j体积下的最优解最终答案就是f[n][m];2.f[i][j]的状态依赖于之前的状态;即f[i[][j]依赖于f[i - 1][j]的状态;也可以理解为所有的状态由f[0][j]推得f[i][j]的状态不好算出来,但是f[0][j]的状态必定为0,由f[0][j]可以算出f[1][j]的,由f[1][j]又可算出f[2][j]的递推可得出全部。f[1][1] f[2][2] f[3][3]他们每个都减去第i个物品的权值最大值仍不变,最后在加上w[i]即可即( f[

描述:给定背包的体积,物品的体积和权值,每个物品仅能使用一次,如何放物体使背包的的利益达到最大、       [0-1]背包]是较为简单的动态规划问题,也是其余背包问题的基础。

动态规划是不断决策求最优解的过程,「0-1 背包」即是不断对第 i个物品的做出决策,

[0-1]正好代表不选与选两种决定。

题目:

输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

8

基本思路:

1.n物品个数,m为背包体积,使用w[i]记录权值,v[i]记录体积,f[i][j]记录选择前i个物体,在不超过j体积下的最优解

最终答案就是f[n][m];

2.f[i][j]的状态依赖于之前的状态;即f[i[][j]依赖于f[i - 1][j]的状态;也可以理解为所有的状态由f[0][j]推得

f[i][j]的状态不好算出来,但是f[0][j]的状态必定为0,由f[0][j]可以算出f[1][j]的,由f[1][j]又可算出f[2][j]的递推可得出全部。f[1][1] f[2][2] f[3][3]他们每个都减去第i个物品的权值最大值仍不变,最后在加上w[i]即可

即( f[1 - 1][j - v[1] ]) + w[i]

题解代码:

import java.util.*;
import java.io.*;
public class Main{
    static int N =  1010;
    static int n,m;
    static int[][] f = new int[N][N];
    static int[] v = new int[N];
    static int[] w = new int[N];
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);  
        n = sc.nextInt(); m = sc.nextInt(); //读取n和m的值  
        for (int i = 1;i <= n;i++ ){  
            int a = sc.nextInt();int b = sc.nextInt();  
            v[i] =  a;w[i] = b;  
        }  
        for (int i = 1;i <= n;i++)//n层每一层算出选择n个物品且体积不超过j的最优解
            for (int j = 1;j <= m;j++){
                f[i][j] = f[i - 1][j]; //取前一个值方便比较,和如果放不下第i个物品,那么f[i][j] = f[i - 1][j];
                if (j  >= v[i]) //把所有能放下i物品的情况与不不能放下的比较,最终结果f[i[m]必然是该状态的最优解
                    f[i][j] = Math.max(f[i][j],f[i - 1][j - v[i]] + w[i]); //把f[i][j]分为两部分f[i - 1][j]和f[i - 1][j - v[i]] + w[i];
            }
        System.out.println(f[n][m]);
    }
}

优化成一维数组

因为

if (j < v[i])
    f[i][j] = f[i - 1][j];
else 
    f[i][j] = Math.max(f[i - 1][j],f[i - 1][j - v[i]] + w[i]);

可以看出f[i][j]只与f[i - 1][j]有关,前面几层都没有意义所以我们可以优化成一维数组

代码:

import java.util.*;
import java.io.*;
public class Main{
    static int N =  1010;
    static int n,m;
    static int[] f = new int[N];
    static int[] v = new int[N];
    static int[] w = new int[N];
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);  
        n = sc.nextInt(); m = sc.nextInt(); //读取n和m的值  
        for (int i = 1;i <= n;i++ ){  
            int a = sc.nextInt();int b = sc.nextInt();  
            v[i] =  a;w[i] = b;  
        }  
        for (int i = 1;i <= n;i++)
            for (int j = m;j >= v[i];j--){
                f[j] = Math.max(f[j],f[j - v[i]] + w[i]); 
            }
        System.out.println(f[m]);
    }
}
目录
相关文章
|
10月前
|
算法 定位技术 vr&ar
Rokid手势识别深度测评:从技术原理到开发实战
Rokid通过单摄像头实现高精度手势识别与空间感知,结合AI算法与多模态交互,打造轻量高效的AR解决方案。其UXR SDK提供从底层数据到应用层的完整工具链,助力开发者构建教育、工业、消费等多场景AR应用,推动自然人机交互普及。
907 13
|
5月前
|
人工智能 算法 搜索推荐
付阳老师“七步闭环法”GEO优化标准作业程序(SOP)深度解析
在AI搜索重构营销的当下,付阳老师首创《七步闭环法》GEO优化体系:以用户真需求为本,紧扣AI检索逻辑与EEAT原则,覆盖诊断、关键词、资料库、选题、创作、发布、迭代全流程,助力企业内容成为DeepSeek、文心等AI工具的“标准答案”,实现低成本、高信任、强占位的精准获客。(239字)
|
5月前
|
弹性计算 关系型数据库 数据库
2026年阿里云用户有哪些优惠权益?正价新购优惠券、免费试用、低价实例等优惠权益介绍
阿里云为个人开发者、企业客户及高校用户提供多维度权益支持,用户完成实名认证后可享受免费试用、低价实例、首次购买优惠及限时活动权益。个人认证用户享有130项免费试用权益,企业用户则享有150项专属权益,包括更高额度的ECS免费试用及云数据库等产品的免费体验。“低价实例购买权益”面向全量用户,支持低价续费;高校用户中,学生可领取300元无门槛券,教师完成认证后可享公共云产品五折优惠。
1234 5
|
5月前
|
人工智能
2026年阿里云域名注册最新优惠解读:选AI建站送cn域名,com域名35元起
2026年阿里云万网推出域名注册优惠活动,购买/续费万小智AI建站或云·企业官网即赠.CN域名首年免费权益。同时,3月域名优惠专场提供20余种热门域名7元起特惠,还有限时直降活动。同时.com、.net、.cn、.xin等域名类型价格大幅优惠,个人企业用户均可享便捷高效的域名服务,活动详情及更多优惠可访问阿里云万网域名注册接口查询。
1837 1
|
7月前
|
弹性计算 运维 安全
阿里云CNAPP云安全中心全解析:优势、费用、合规及使用一文说透
阿里云CNAPP(智能云原生应用保护平台)整合CWPP、CSPM、CIEM与CTDR四大能力,提供覆盖“事前-事中-事后”的全链路安全防护。支持多云统一管理,内置380+检测模型,具备等保、ISO、PCI DSS等20+合规认证,助力企业实现一体化、智能化安全运营。免费版开放基础功能,高级版按需付费,新用户享15天全功能试用,快速构建云上安全防线。
|
7月前
火语言 RPA “按住滑块拖动到最右边” 自动化案例
本案例基于火语言RPA,实现网页滑块验证自动化。通过模拟人工拖拽轨迹,完成“打开浏览器→访问登录页→定位并拖动滑块至最右”的全流程,高效应对账号登录、文档协作等场景中的滑块验证,提升操作效率与自动化水平。
755 1
|
机器学习/深度学习 人工智能 算法
《深度揭秘:解锁智能体大模型自我知识盲区探测》
智能体大模型在面对超出训练数据边界的问题时,常因缺乏自我知识盲区探测能力而陷入困境。与人类能敏锐感知并弥补知识不足不同,大模型可能给出错误答案却浑然不觉。为解决这一问题,研究者正从元学习、强化学习、知识图谱及多智能体协作等方向探索,试图赋予大模型自动发现知识盲区的能力。这不仅涉及精准的自我评估算法设计,还需应对复杂环境下的知识多样性和动态变化。若成功实现,将在医疗、金融、教育等领域带来深远变革,助力智能体从“助手”迈向“可靠伙伴”。
380 7
|
8月前
|
存储 人工智能 安全
医疗影像云存储方案
医疗影像云存储方案通过云原生技术,构建安全合规、高效智能的影像管理新范式。面对大文件、高并发、长周期保存等挑战,方案融合分层架构、分片传输、全链路加密与AI协同,实现弹性扩容、低延迟访问与成本优化,并已在三甲医院成功落地,助力精准医疗迈向高质量发展。(238字)
737 1
|
7月前
|
存储 安全 前端开发
浅谈前端安全领域的XSS攻击
本文由喵喵侠撰写,介绍前端安全中的XSS(跨站脚本攻击)基本概念与防范。涵盖反射型、存储型和DOM型XSS原理,并通过一个留言板案例演示攻击过程。文章还提供防御建议,如避免使用innerHTML、采用DOMPurify过滤恶意脚本,帮助开发者提升安全意识,防范常见前端漏洞。
335 0
|
8月前
|
搜索推荐 算法 机器人
告别“机器味”:服务机器人的下一个护城河,是听觉人格的重构
服务机器人竞争已从硬件转向交互体验,TTS语音合成成为关键“听觉UI”。不同场景需匹配文化、信任与转化需求,结合大模型、高算力与开放API,实现千人千面的声音定制,构建差异化服务壁垒,推动商业价值升级。(239字)

热门文章

最新文章