蛮力法0/1背包问题实验

实验项目1 蛮力法

实验题目 使用蛮力法解决0/1背包问题。

问题描述:给定n个重量(weight)为{w1, w2, … ,wn}价值(key)为{v1, v2, … ,vn}的物品和一个**容量为C(contain)**的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。
eg:示例:
背包容量C=15kg
物品1:重量2kg,价值2$
物品2:重量12kg,价值4$
物品3:重量1kg,价值2$
物品4:重量1kg,价值1$
物品5:重量4kg,价值10$

img

实验目的

  1. 理解算法的时间复杂度;
  2. 熟练设计和生成问题的解空间:设计一种穷举策略将物品装入背包的各种装法都找出来,并能够在计算机中存储和表示。
  3. 理解蛮力法的局限性;
  4. 实验要求
  5. 掌握用递归或循环生成n个元素的全部子集的算法设计方法;

按上图示例数据求解出问题的一个最优解:装入哪几个物品价值最大,总重量和总价值各是多少?

蛮力法的主要框架

// 辅助数组,防止递归死循环
int visited[5] = { 0 };
// w容量,key价值,len:weight数组长度 depth 深度
void backpack(int w, int* weight, int* key, int len, int depth, int tempSum) {// 如果到达物品数组的末尾 地柜出口if (depth == len) {return;}// 不选择当前物品visited[depth] = 0;backpack(w, weight, key, len, depth + 1, tempSum);// 如果能选择当前物品(背包容量足够)visited[depth] = 1; // 选择当前物品backpack(w - arr[depth], weight, key, len, depth + 1, tempSum + key[depth]); // 递归调用
}

不难看出使用的是递归的方式

算法代码

#include<stdio.h>// 辅助数组,防止递归死循环
int visited[5] = { 0 };
// 寻找最大值
int sumMax = 0;
//
int weightSum = 0;
// 寻找最大值对应装填方式
int method[5] = { 0 };
int capacity = 15; // 背包容量
int count = 0;
//判断容量是否合理
int LessCapacity(int len,const int* arr){int sumWeight = 0;for (int i = 0; i < len; ++i) {if(visited[i] == 1)sumWeight += arr[i];}
//    满足小于等于15 为 1return sumWeight<=capacity ? 1:0;
}
// 遍历当前状态,更新最大价值和装填方式
void Traverse(int* arr,  int len, int tempSum, int depth) {printf("--------------------------------------------\n");int weight = 0;// 打印当前状态printf("重量: ");for (int i = 0; i < len; ++i) {printf("%d  ", arr[i]);}printf("\n");printf("选择: ");for (int i = 0; i < len; i++) {printf("%d  ", visited[i]);if(visited[i]){weight+=arr[i];}}printf("\n");printf("当前总重量: %d\n", weight);printf("当前总价值: %d\n", tempSum);if(weight>capacity){printf("该情况不符合要求!\n");}else{printf("该情况符合要求!\n");}printf("--------------------------------------------\n\n");// 如果当前价值大于已知的最大价值,则更新最大价值和method数组if (tempSum > sumMax && LessCapacity(len,arr)) {sumMax = tempSum;
//        更新选择方法for (int i = 0; i < len; i++) {method[i] = visited[i];}}}// 背包问题的递归函数
void backpack(int w, int* arr, int* key, int len, int depth, int tempSum) {// 如果到达物品数组的末尾或背包容量已满,则遍历当前状态if (depth == len) {count++;Traverse(arr, len, tempSum, depth);return;}// 不选择当前物品visited[depth] = 0;backpack(w, arr, key, len, depth + 1, tempSum);// 如果能选择当前物品(背包容量足够)visited[depth] = 1; // 选择当前物品backpack(w - arr[depth], arr, key, len, depth + 1, tempSum + key[depth]); // 递归调用
}
// 判断重量<=15int main() {// 重量int weight[] = { 2, 12, 1, 1, 4 };// 重量对应的价值int key[] = { 2, 4, 2, 1, 10 };backpack(capacity, weight, key, 5, 0, 0); // 调用背包问题的递归函数printf("----------------------------------分隔符----------------------------------\n");printf("总共有%d种情况\n",count);printf("重量: ");for (int i = 0; i < sizeof(weight)/sizeof (int); ++i) {printf("%d  ", weight[i]);}printf("\n");printf("选择: ");for (int i = 0; i < sizeof(weight)/sizeof (int); i++) {printf("%d  ", method[i]);if(method[i] == 1){weightSum+=weight[i];}}printf("\n 最终重量:%d",weightSum);printf("\n 最终最优金额:%d",sumMax);return 0;
}

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

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

相关文章

【简单介绍下链表基础知识】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

vue data中的return

vue 的data return 是干啥的呢&#xff0c;vue中页面中绑定的变量都要放在data的return中&#xff0c;可以赋值&#xff0c;值可在script中改&#xff0c;修改引用就用this了 如果不使用return包裹的数据会在项目的全局中可见&#xff0c;会造成变量污染&#xff1b; 使用retu…

《AI学习笔记》大模型-微调/训练区别以及流程

阿丹&#xff1a; 之前一直对于大模型的微调和训练这两个名词不是很清晰&#xff0c;所有找了一个时间来弄明白到底有什么区别以及到底要怎么去使用去做。并且上手实践一下。 大模型业务全流程&#xff1a; 大模型为啥要微调&#xff1f;有哪些微调方式&#xff1f; 模型参数…

简易进程池的实现

什么是进程池&#xff1f; 进程池&#xff08;Process Pool&#xff09;是一种用于管理和复用多个进程的技术或设计模式。在进程池中&#xff0c;一定数量的进程会被预先创建并保持在内存中&#xff0c;以便在需要时立即使用&#xff0c;而不是每次需要进程时都重新创建新的进程…

每日一题《leetcode--1472.设计浏览器历史记录》

https://leetcode.cn/problems/design-browser-history/ 这里我是用双栈实现前进和后退。 #define URL_SIZE 21 #define STACK_SIZE 5000typedef struct {char *BackStack[STACK_SIZE]; //回退栈char *ForwardStack[STACK_SIZE]; //前进栈int BackTop; //回退栈的栈顶下标…

Kubectl 的使用——k8s陈述式资源管理

一、kebuctl简介: kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为 apiserver 能识别的信息&#xff0c;进而实现管理 k8s 各种资源的一种有效途径。 对资源的增、删、查操作比较方便&…

使用nvm管理nodejs多个版本

在工作中&#xff0c;可能会遇到同时使用vue2和vue3开发项目&#xff0c;但他们的nodejs版本又不同&#xff0c;给你带来了困扰&#xff0c;不知道怎么办&#xff1f;这时就可以使用nvm管理多个nodejs版本 第一步&#xff1a;先去github上面下载nvm 这是下载地址&#xff1a;…

Fastjson漏洞之CVE-2017-18349

前言&#xff1a; 要想理解漏洞原理&#xff0c;首先看看Fastjson是什么&#xff0c;具体用来做什么才能更好的找到可以利用的场景&#xff1a; Fastjson 是一个由阿里巴巴开发的 Java 语言实现的高性能 JSON 解析器和生成器。它具有以下特点: 快速&#xff1a;Fastjson 在序列…

《我的阿勒泰》读后感

暂没时间写&#xff0c;记录在此&#xff0c;防止忘记&#xff0c;后面补上!!! 【经典语录】 01、如果天气好的话&#xff0c;阳光广阔地照耀着世界&#xff0c;暖洋洋又懒洋洋。这样的阳光下&#xff0c;似乎脚下的每一株草都和我一样&#xff0c;也把身子完全舒展开了。 02、…

OpenHarmony 实战开发——一文总结ACE代码框架

一、前言 ACE_Engine框架是OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;的UI开发框架&#xff0c;为开发者提供在进行应用UI开发时所必需的各种组件&#xff0c;以及定义这些组件的属性、样式、事件及方法&#xff0c;通过这些组件可以方便进行OpenHarmo…

输入输出(3)——C++的标准输入流

目录 一、cin 流 二、成员函数 get 获取一个字符 (一)无参数的get函数。 (二)有一个参数的get函数。 (三&#xff09;有3个参数的get函数 (四&#xff09;用成员函数 getline 函数读取一行字符 (五&#xff09;用成员函数 read 读取一串字符 (六&#xff09;istream 类…

HACL-Net:基于MRI的胎盘植入谱诊断的分层注意力和对比学习网络

文章目录 HACL-Net: Hierarchical Attention and Contrastive Learning Network for MRI-Based Placenta Accreta Spectrum Diagnosis摘要方法实验结果 HACL-Net: Hierarchical Attention and Contrastive Learning Network for MRI-Based Placenta Accreta Spectrum Diagnosis…

NXP i.MX8系列平台开发讲解 - 3.12 Linux 之Audio子系统(一)

专栏文章目录传送门&#xff1a;返回专栏目录 目录 1. Audio 基础介绍 1.1 音频信号 1.2 音频的处理过程 1.3 音频硬件接口 1.3 音频专业术语解释 2. Linux Audio子系统介绍 3. Linux Audio子系统框架 Linux嵌入式系统中的音频子系统扮演着至关重要的角色&#xff0c;它涉…

爬虫案例-亚马逊反爬流程分析梳理(验证码突破)(x-amz-captcha)

总体概览&#xff1a;核心主要是需要突破该网站的验证码&#xff0c;成功后会返回我们需要的参数后再去请求一个中间页&#xff08;类似在后台注册一个session&#xff09;&#xff0c;最后需要注意一下 IP 是不能随意切换的 主要难点&#xff1a; 1、梳理整体反爬流程 2、验证…

哥白尼哨兵系列卫星数据不能下载的解决方法

自2023年1月24日起&#xff0c;一个新的哥白尼数据空间生态系统已经启动&#xff0c;为所有哨兵数据&#xff08;Sentinel-1, Sentinel-2, Sentinel-3 and Sentinel-5P&#xff09;提供可视化和数据处理&#xff0c;地址为&#xff1a;https://dataspace.copernicus.eu/。详细介…

算法刷题笔记 高精度乘法(C++实现)

文章目录 题目描述解题思路解题代码 题目描述 给定两个非负整数&#xff08;不含前导0&#xff09;A和B&#xff0c;请你计算 AB的值。 输入格式 共两行&#xff0c;第一行包含整数 A&#xff0c;第二行包含整数 B。 输出格式 共一行&#xff0c;包含AB的值。 数据范围 …

world machine学习笔记(3)

打开 可以打开场景设置&#xff0c;项目设置平铺构建设置 场景设置&#xff1a; 输出范围 设置中心点和范围 设置分辨率 项目设置&#xff1a; 设置地图颜色&#xff0c;单位&#xff0c;最高地形高度 点击这个图形进行预览设置 该按钮还有其他的功能 world machine基础流程…

知识分享:大数据信用花导致的评分不足多久能恢复

随着金融风控领域越来越科技化&#xff0c;基于大数据技术的金融风控成为了贷前风控不可或缺的重要环节&#xff0c;相信很多人在申贷的时候都听说过大数据信用和综合评分等词语&#xff0c;那大数据信用花导致的评分不足多久能恢复呢?本文带大家一起去了解一下。 首先&#x…

【AI大模型】这可能是最简单的本地大模型工具,无须部署,一键使用

目录 前言 LM-Studio​编辑 那么问题来了&#xff0c;为什么我要在本地部署大模型&#xff1f; 隐私性&#xff1a; 定制性&#xff1a; 成本和体验的优化&#xff1a; 工具功能特点和使用方式介绍&#xff1a; 首页提供搜索功能和一些模型的推荐 模型下载管理&#x…

【Python】 探索Python中的整数最大值和最小值

基本原理 在Python中&#xff0c;整数&#xff08;int&#xff09;类型是一种基本数据类型&#xff0c;用于表示整数。Python的整数类型是动态的&#xff0c;这意味着它们可以自动扩展以存储非常大的数值。然而&#xff0c;尽管Python的整数可以非常大&#xff0c;但它们仍然有…