头歌资源库(13)背包问题

news2024/11/17 3:25:42

一、 问题描述

 二、算法思想 

这是一个背包问题,可以使用动态规划算法来解决。具体思路如下:

  1. 定义一个二维数组dp,dp[i][j]表示前i个物品在背包容量为j时能获取的最大价值。
  2. 初始化dp数组的第一行和第一列为0,表示当只有一个物品或背包容量为0时,最大价值为0。
  3. 遍历每个物品i和每个背包容量j,根据以下状态转移方程更新dp数组:
    • 如果物品i的重量大于背包容量j,则无法放入背包,dp[i][j] = dp[i-1][j]。
    • 如果物品i的重量小于等于背包容量j,则考虑放入或不放入物品i的情况:
      • 放入物品i,dp[i][j] = dp[i-1][j-weight[i]] + value[i],其中weight[i]表示物品i的重量,value[i]表示物品i的价值。
      • 不放入物品i,dp[i][j] = dp[i-1][j]。
    • 选择较大的值作为dp[i][j]。
  4. 从dp数组的最后一个元素往前遍历,根据状态转移方程可以得到装入背包的物品编号。
  5. 输出装入背包的物品编号。

三、代码实现 

#include <stdio.h>

#define MAX_ITEMS 100
#define MAX_WEIGHT 1000

int max(int a, int b) {
    return (a > b) ? a : b;
}

// 动态规划求解背包问题
void knapsack(int n, int capacity, int weights[], int values[]) {
    int dp[MAX_ITEMS + 1][MAX_WEIGHT + 1] = {0};
    int i, w;

    // 填表格
    for (i = 1; i <= n; i++) {
        for (w = 1; w <= capacity; w++) {
            if (weights[i - 1] > w) {
                dp[i][w] = dp[i - 1][w];
            } else {
                dp[i][w] = max(dp[i - 1][w], values[i - 1] + dp[i - 1][w - weights[i - 1]]);
            }
        }
    }

    // 回溯找出装入背包的物品
    int res[MAX_ITEMS];
    int k = n, c = capacity;
    int num = 0;
    while (k > 0 && c > 0) {
        if (dp[k][c] != dp[k - 1][c]) {
            res[num++] = k;
            c -= weights[k - 1];
        }
        k--;
    }

    // 输出结果
    for (i = num - 1; i >= 0; i--) {
        printf("%-d ", res[i]);
    }
    printf("\n");
    printf("end");
}

int main() {
    int n, capacity;
    scanf("%d %d", &n, &capacity);

    int weights[MAX_ITEMS], values[MAX_ITEMS];
    for (int i = 0; i < n; i++) {
        scanf("%d", &weights[i]);
    }

    for (int i = 0; i < n; i++) {
        scanf("%d", &values[i]);
    }

    // 调用背包问题求解函数
    knapsack(n, capacity, weights, values);

    return 0;
}

执行结果 

  结语  

如果你喜欢一匹马

不必去追,去种草

来年会有一群马向你奔来

!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1839323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置 本文内容机器人介绍Bruce机器人Gazebo中仿真代码部署Bruce真机代码部署 本文内容 人形机器人Brcue相关介绍docker中安装Gazebo并使用Bruce机器人控制器更换环境配置 机器人介绍 公司&#xff1a;西木科技Westwood-R…

Microsoft AI Day:支持开放合作,普及技术应用,推进行业企业智慧化创新

微软在北京举办以“共创AI创新&#xff0c;智启无限可能”为主题的Microsoft AI Day活动&#xff0c;集中展示了在生成式智能技术加速发展普及的过程中&#xff0c;微软取得的最新技术突破与进展&#xff0c;并同步更新了在Microsoft Build 2024全球开发者大会上发布的一系列Az…

【MATLAB源码-第227期】基于matlab的北方苍鹰优化算法(NGO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 鼠群优化算法&#xff08;Rat Swarm Optimization, RSO&#xff09; 简介 鼠群优化算法&#xff08;Rat Swarm Optimization, RSO&#xff09;是一种模仿鼠类群体觅食行为的优化算法。该算法属于群体智能算法&#xff0c;通…

Mathtype7.6最新破解版下载,功能超乎你想象!

嘿&#xff0c;亲爱的小伙伴们&#xff01;今天我要分享一个让你的学术生涯或教育工作变得轻松无比的秘密工具 —— Mathtype7.6最新破解版下载。&#x1f389; MathType最新Win官方版本下载如下: https://wm.makeding.com/iclk/?zoneid34223 MathType最新Mac官方版本下载如…

macOS聚集搜索功能开启与关闭

按下command空格弹出 使用搜索 关闭搜索 sudo mdutil -a -i off 启用搜索 sudo mdutil -a -i on

跟张良均老师学大数据人工智能|企业项目试岗实训开营

我国高校毕业生数量连年快速增长&#xff0c;从2021年的909万人到2022年的1076万人&#xff0c;再到2023年的1158万人&#xff0c;预计到2024年将达到1187万人&#xff0c;2024年高校毕业生数量再创新高。 当年高校毕业生人数不等于进入劳动力市场的高校毕业生人数&#x…

ardupilot开发 --- RTSP视频流 篇

我年轻时很穷&#xff0c;努力了几年&#xff0c;终于不再年轻了 0. 一些概念参考文献 0. 一些概念 RTSP服务、RTSP推流、RTSP拉流&#xff0c;缺一不可&#xff0c;尤其是RTSP服务。RTSP服务器、RTSP客户端。推流和拉流都是由客户端发起&#xff0c;向服务器发起对应的请求。…

安享智慧理财金融测试项目

1. 项目介绍 安享智慧理财金融系统是基于 Java 语言开发&#xff0c;集 PC 端、APP 端、WAP 端为一体的 P2P&#xff08;个人对个人&#xff09;的借贷系统&#xff0c;提供了完整的借款和投资功能。 web用户端 说明&#xff1a;PC 网站&#xff0c;供借款人和投资人使用功能…

Java面试八股之myBatis如何将SQL结果封装成目标对象并返回

myBatis如何将SQL结果封装成目标对象并返回 ResultMap与自动映射&#xff1a; MyBatis主要通过ResultMap来描述如何将SQL查询结果映射到Java对象上。如果查询结果的列名与对象的属性名一致&#xff0c;MyBatis能够自动进行映射。但当列名与属性名不匹配时&#xff0c;就需要…

【mysql】排错和调优

通用的一些排错方法。 1、查看进程信息 mysql> show full processlist;mysql> show processlist; 2、information_schema information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名&#xff0c;数据库的表&#xff0c;表栏的数据类型与访问权限等。…

【CT】LeetCode手撕—141. 环形链表

目录 题目1- 思路2- 实现⭐141. 环形链表——题解思路 3- ACM实现 题目 原题连接&#xff1a;141. 环形链表 1- 思路 模式识别 模式1&#xff1a;判断链表的环 ——> 快慢指针 思路 快指针 ——> 走两步慢指针 ——> 走一步判断环&#xff1a;若快慢相遇则有环&a…

LUA移植到STM32F4,移植REPL,通过RTT Viewer交互

概述 站内移植LUA多数是使用C函数调用LUA&#xff0c;并没有移植REPL交互端口 本文将REPL也移植进去&#xff0c;做了简单的适配 LUA源码使用标准C库函数&#xff0c;如fgets&#xff0c;fwrite等&#xff0c;在嵌入式环境中要使用fgets&#xff0c;fwrite等C库函数&#xff…

发论文idea来了!强化学习+Transformer,29个创新点汇总

基于Transformer的强化学习&#xff08;TRL&#xff09;是一种利用Transformer模型架构来改进和增强强化学习算法性能的方法。 这种方法通过结合Transformer模型强大的表示能力和强化学习的决策优化框架&#xff0c;显著提升了智能体的学习能力和适应能力&#xff0c;为我们解…

逻辑蕴含、函数依赖集的闭包、Armstrong公理、属性集闭包

一、引言 Armstrong公理-从给定的函数依赖集得到关系模式的完整依赖集 二、逻辑蕴含 1、定义 设F是关系模式R上的函数依赖集&#xff0c;X、Y是R的属性子集&#xff0c;对于R的每个满足F的关系实例r&#xff0c;若函数 依赖都成立&#xff0c;则称F逻辑蕴含。 记为&#…

今日分享:能源行业数据大屏与界面设计~

能源行业数据大屏设计时要紧扣行业主题&#xff0c;关注视觉效果、实时数据与动态效果、数据可视化和图表、布局与字体、交互性、告警功能、故事叙述、易读性和可维护性等多个方面。大家设计时可以从这几个方面进行检查调整&#xff0c;这样就可以设计出既美观又实用的能源行业…

支持的 Google Pixel 设备

Android 15 OTA 和下载内容适用于以下 Pixel 设备&#xff1a; Pixel 6 和 Pixel 6 ProPixel 6aPixel 7 和 Pixel 7 ProPixel 7aPixel FoldPixel TabletPixel 8 和 Pixel 8 ProPixel 8a 获取 Android 15 Beta 版 1 、HONOR Android 15 Beta 2 Magic6 Pro Android 15 Beta …

【Redis技术进阶之路】「原理分析系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 SDS&#xff08;简单动态字符串&#xff09;C字符串C字符串存在的问题字符串存储局限性不存储字符串长度…

【区块链】以太坊白皮书深度解读:构建智能合约的分布式平台

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 以太坊白皮书深度解读&#xff1a;构建智能合约的分布式平台引言1. 以太坊的诞生…

对比4090及4090D:国区“特供”与原版相比有何区别?

2023年12月28日 英伟达宣布正式发布GeForce RTX 4090D&#xff0c;对比于一年前上市的4090芯片&#xff0c;两者的区别与差异在哪&#xff1f;而在当前比较火热的大模型推理、AI绘画场景方面 两者各自的表现又如何呢&#xff1f; 规格与参数信息对比现在先来看看GeForce RT…