贪心算法-- 0-1背包问题求解及思路

贪心算法实现0-1背包问题(python3.6版) 贪心算法解决0-1背包问题——python版 贪心算法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好的或最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好或最优的解。贪婪法的每次决策都以当前情况为基础并根据某个最优原则进行选择,不从整体上考虑其他各种可能的情况。 背包问题 本次例子为0-1背包问题:有 N 件物品... 阅读详情

贪心算法是一种只考虑眼前利益的思路,不全盘考虑问题的所有可能,每一步做出当时看起来最佳的选择(局部最优选择)

给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包最大承载重量为C。假设物品是不可分割的,应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

 花瓶:10公斤 60w      屏风:30公斤 120w   砚台:20公斤 100w

首先我们按照物品的单位重量价值来进行排序,然后按照单位重量价值从高到低依次进行选择,若其能装入背包则将其装入,不能则继续判断下一个直至所有物品都判断完,就得到了问题的一个解。但是对于0-1背包问题贪心算法并不能保证背包全部空间被利用因此背包的单位物品价值就会变低 因此0-1背包问题利用贪心算法并不能求得最优解。

代码如下:

#include<bits/stdc++.h>
using namespace std;
void Sort1(int n,double w[],double v[]){
    int max1;
    double t[20];
    for(int i=1;i<=n;i++){
        t[i]=v[i]/w[i];
        //cout<<t[i]<<endl;
    }
    for(int i=1;i<=n;i++){
        max1=i;
        for(int j=i+1;j<=n;j++){
            if(t[j]>t[max1]){
                max1=j;
            }
        }
        swap(t[i],t[max1]);
        swap(w[i],w[max1]);
        swap(v[i],v[max1]);
    }
    for(int i=1;i<=n;i++){
        cout<<t[i]<<endl;
    }
}
//n为物品数量,c为背包最大容量,w[]为物品重量,v[]为物品价值,b[]为背包存放 
void knapsack_greedy(int n,double c,double w[],double v[],double b[]){
    int j;
    //Sort1(n,w,v);
    Sort1(n,w,v);
    for(int i=1;i<=n;i++)//初始化背包b[]
        b[i]=0;
    for(j=1;j<=n;j++){
        if(c<w[j]) break;
        b[j]=1;
        c=c-w[j];
    } 
    if(j<=n)
        b[j]=c/w[j];
    cout<<"输出:"<<endl;
    for(int i=1;i<=n;i++){
        cout<<"物品重量为:"<<w[i]<<" "<<"物品比例"<<b[i]<<endl;
    }
}
int main(){
    int n,c;
    double b[20],w[20],v[20];
    cout<<"输入物品数量和背包容量:";
    cin>>n>>c;
    cout<<"输入物品重量(如:30 10 20):"; 
    for(int i=1;i<=n;i++)
        cin>>w[i];
    cout<<"输入物品的价值(如:120 60 100):"; 
    for(int i=1;i<=n;i++)
        cin>>v[i];
    knapsack_greedy(n,c,w,v,b);    
    return 0 ;
}

 

 

贪心算法背包问题c 这个状态转移方程表示,对于前i个物品在容量为j的背包中能够获得的最大价值f[i][j],要么是前i个物品在容量为j的背包中能够获得的最大价值f[i][j],要么是前i - 1个物品在容量为j - w[i]的背包中能够获得的最大价值f[i - 1][j - w[i]] + v[i]。初始状态是f[0][j] = 0,表示不取任何物品时的价值为0。f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i])其中w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。 阅读详情

相关推荐

Python 算法入门教程:贪心算法之背包问题

背包问题,主要讲解了什么是背包问题,如何利用贪心算法解决背包问题,给出了背包问题的实现伪代码并进行分析,并用 java 语言进行了伪代码实现,帮助大家通过背包问题更好的理解贪心算法思想的应用。假设我们一共有 n 种物品,每种物品 i 的价值为 vi,重量为 wi,我们有一个背包,背包的容量为 c(最多可以放的物品重量不能超过 c),我们需要选择物品放入背包中,使得背包中选择的物品中总价值最大,在这里每个物品可以只选择部分。这便是我们常说的背包问题。

win19970108018的博客 819

01背包问题三种解决(贪心动态规划分支限界)

一、实验目的 1、深入理解背包相关问题。 2、能正确设计相应的算法,解决实际问题。 3、掌握算法时间复杂度分析。 二、实验要求 用3种方法求解0-1背包问题(贪心算法、动态规划、分支限界法),获得精确最优解或近似最优解均可。 通过一个规模较大的实例比较不同方法的求解速度,分析不同算法的时间复杂度,并分析是否能获得最优解。 实验结果跟实验设置的参数(如:背包容量、物品的体积)关系很大,简要分析参数对结果的影响。 三、实验原理 1.动态规划解0-1背包原理: 动态规划基本思想是将带.

Edward_Mcc的博客 2万+

搜索最优解算法之贪心算法

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。迪杰斯特拉算法是贪心算法的一个典型案例。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。[1]  贪婪算法可解决的问题通常大部分都

xunfeng13的专栏 2万+

贪心法/非01背包问题

这个问题不是01背包问题,01背包问题物品不能装入一部分,要么全部装入,要么不装入 背包问题:物品可以装入一部分贪心准则:先选择单位重量价值最大的物品,依次类推 最优性原理:最优子结构问题,子问题也是01背包问题,对子问题的求解等价于对大问题的求解......

求道问术 576

0-1背包(猫鼠游戏)

题目描述FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.The warehouse has N rooms. The i-th room contains J[i] pounds o...

m0_37793582的博客 226

算法设计与分析期末考试 on PTA

4-1 算法的复杂性有时间复杂性和空间复杂性之分。 4-2 若存在两个正的常数c和n0,对于任意n≥n0,都有T(n)≤c×f(n),则称T(n)= Ω (f(n))。 4-3 用贪心算法求解的问题一般具有两个重要性质是: 贪心原则和最优子结构性质。 4-4 分支限界法采用 深度 优先的方式搜索解空间,回溯法采用 广度 优先的方式搜索解空间。 4-5 通常, 贪心算法、分支限界、回溯的求解策略是自顶向下求解, 动态规划是自底向上的递推求解。 4-6 回溯法搜索解空间树时,常用的两种剪枝函数为 约束函数和限界

嗨Sirius 3258

Python数据结构与算法-贪心算法(一)

python数据结构与算法

little_limin的博客 2684

背包问题之贪婪算法求解C语言源代码).

背包问题之贪婪算法求解C语言源代码).背包问题之贪婪算法求解C语言源代码).

算法:背包问题解析

部分背包问题和0-1背包问题解析。

weixin_43403605的博客 4664

Spring Boot 3.5.4 + LangChain4j实战:用Milvus搭建企业级RAG问答系统(附阿里百炼API配置)

本文详细介绍了如何利用Spring Boot 3.5.4、LangChain4j与Milvus构建企业级RAG问答系统。内容涵盖从架构设计、阿里百炼API安全配置、Milvus部署优化,到RAG检索、会话管理等核心实现,并提供了生产级API设计、监控集成及性能优化等实战经验,旨在帮助开发者打造高可用、可维护的Java AI应用。

weixin_29054399的博客 610

贪心算法介绍

1、基本概念 假设一个问题比较复杂,暂时找不到全局最优解,那么我们可以考虑把原问题拆成几个小问题(分而治之思想),分别求每个小问题的最优解,再把这些“局部最优解”叠起来,就“当作”整个问题的最优解了。所以,贪心算法得到的结果并不是全局最优!也就是每一步都选择目前最优,而不考虑是不是全局最优。 2、贪心算法的基本思路 1)建立数学模型来描述问题。 2)把求解的问题分成若干个子问题。 3)对每个子问题求解,得到子问题的局部最优解。 ...

alex1801 589

差分音频转单端音频单电源方案

其中,芯片设计中的轨到轨输出(Rail-to-Rail Output) 是指通过特定的电路设计,使芯片(如运算放大器、驱动电路等)的输出电压能够达到或接近电源电压的上下极限(即“电源轨”),从而最大化信号的动态范围。最终,Vout=R2/R1*(Vin2−Vin1),即输出电压为输入电压差(Vin2−Vin1)乘以电阻比R2/R1。2、电阻:R1、R2、R3、R4是电路中的电阻,其中R1 = R3,R2 = R4。因R1=R3,R2=R4,且Vn=Vp,设R1=R3=R,R2=R4=kR。

电子绿洲的博客 4955

一文吃透背包问题:算法世界的宝藏谜题

背包问题作为一个经典的组合优化问题,贯穿于我们生活与工作的诸多场景,从日常旅行的物品挑选,到商业决策中的资源分配,再到密码学等专业领域的应用,其身影无处不在。它不仅是一个数学和算法问题,更是解决实际问题的有力工具。我们探讨了暴力枚举法、动态规划法和贪心算法等常见解法。暴力枚举法虽然直观但效率低下,适用于小规模问题;动态规划法通过巧妙地分解子问题和利用记忆化搜索,能有效解决 0-1 背包等问题,并且在空间优化后更加高效;

大雨淅淅的博客 980

ECC椭圆曲线加解密原理详解(配图)

椭圆曲线加解密原理详解 本文主要参照:ECC椭圆曲线详解(有具体实例)[1] 前言: 椭圆曲线(ECC)加密原理跟RSA加解密原理比起来,可真是晦涩难懂。拜读了大神Kalafinaian文章“ECC椭圆曲线详解(有具体实例)”,终于看到了参透的曙光。 由于原文中有微小的瑕疵,也为了便于阅读起来更加流畅,我重新整理了一下这篇文章。 为什么使用椭圆曲线加密算法? RSA的解决分解整数问题需要亚指数...

Mark的博客 7万+

从养虾到退坑:OpenClaw 卸载不留残留,一步到位

文章摘要: 本文提供OpenClaw软件的完整卸载指南,适用于Windows、macOS和Linux系统。内容包含卸载前的数据备份步骤(配置文件、日志、插件列表),以及详细的卸载脚本。Windows版通过批处理文件删除程序文件、注册表项和环境变量;macOS/Linux版则提供shell脚本,涵盖服务停止、软件包卸载、配置清理等步骤。特别强调要删除所有用户数据(包括多用户环境),确保系统无残留。文末建议重启计算机以使更改生效,实现"一步到位"的彻底卸载。

一键难忘的博客 298

每日一题 2023.10.22

然后 不断加如果sum>0 说明收益为正,加入结果中(之前加过的值都会再加一次--->乘法的作用)然后再取收益次大的S1 满足S1+2S0>S0 则加进去。由于我们尽可能要把大的值加进去,所以先排序(从大到小)同理 不断相加 满足条件则加 不满足跳过。获得最大收益,是最值问题,考虑动规。首先,我们取一个收益最大的S0。状态:有没有选这道菜。

blueoni的博客 90

SKUA-GOCAD入门教程-第八节 线的创建与编辑7和8

本文介绍了曲线编辑操作的主要功能,包括曲线部分和区域的管理操作。在曲线部分操作方面,详细说明了如何合并、删除、移动和过滤曲线部分,支持精确或带公差的合并方式。在曲线区域操作方面,阐述了保留/删除区域点、移动区域点、保留/删除区域线段等操作。此外还介绍了节点连接功能,包括新增/删除连接、端点连接以及为曲线赋予地质特征的方法。

江洋大葱的博客 390

数据结构与算法实战

作业一:数据结构与算法基础 判断数组中所有的数字是否只出现一次。给定一个数组array,判断数组 array 中是否所有的数字都只 出现过一次。例如,arr = {1, 2, 3},输出 YES。又如,arr = {1, 2, 1},输出 NO。约束时间复杂度为 O(n)。 理题 判断一系列数中的数字是否都只出现过一次,或者判断一系列数中的数字是否有重复出现过。 都只出现过一次则输出yes,否则输出no。 思路一 两两相比,时间复杂度为O(n^2) 思路二 排序加前后比较是否相等,时间复杂度为O(n^2)

jiqiren1994的博客 334

17track单号查询逆向分析

这就说明该网站很有可能存在其它检测点,而检测本地替换最大可能的就是检测了代码格式化或者代码长度。也一样,要么导致网站卡死,要么会导致网页加载异常,这里可能就难到不少人了,让我们一步一步解决。而这个站主要是检测了代码格式化,无限循环检测造成了网站卡死,经多次测试发现检测点共三处。方法中代码很长,但是经调试后发现,它其实只返回一个固定的值,这里直接写死即可。同样的,虽然看起来很长,但是跟过之后就会发现流程很简单,这里主要就是对。追加了一些值,是一条很长的语句,整理代码。,核心流程也很简单,稍微跟一下就出来了,

pyzzd的博客 1621

基于STM32的智能婴儿床设计(蓝牙通信+摄像头监控)_315

本项目设计并实现了一款基于STM32微控制器的智能婴儿床系统,通过多种传感器和智能控制模块为家长提供更便捷和高效的婴儿照护解决方案。系统包括婴儿哭泣检测、湿度监测、空气质量检测、温度监控等多项功能,并通过蓝牙与手机APP进行数据传输和远程控制。婴儿床内置摇摇床和安抚音乐播放功能,能够在婴儿哭泣时自动启动摇摇床并播放安抚音乐。此外,系统还支持摄像头远程监控,让家长实时查看婴儿的状态。整个系统采用STM32F103RCT6作为核心控制单元,结合声音传感器、湿度传感器、MQ135空气质量传感器。

863

【算法系列04】动态规划及其应用

一、动态规划思想: 二、应用 1.每对结点间的最短路径(弗洛伊德算法) 任意两点之间可能存在第三个点使得距离两点之间距离变近(可能存在二个三个更多) 所以核心算法也就是 if(d[i][j]>d[i][k]+d[k][j] ) d[i][j]=d[i][k]+d[k][j]; 主要是要理解几个图,零阶矩阵来表示图,用path[ ][ ]来记录路程。 剩下的就是初始化一一赋值。 核...

qq_41898761的博客 281

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

算法训练Day41&42

小白坚持了40天,可喜可贺,继续加油

CodeKiller123的博客 137

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

背包问题贪心算法求解

题目 有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 思路 具有最优子结构性质和贪心选择性质。只要是所有物品的总重量大于背包容纳量,那么背包一定能装满。注意背包问题与0-1背包问题的区别。 这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。 求解步骤 用...

practical_sharp的博客 6万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

0-1背包问题、贪心算法、动态规划

1、0-1背包问题         0-1背包问题:有一个贼在偷窃一家商店时,发现有n件物品,第i件物品价值vi元,重wi磅,此处vi与wi都是整数。他希望带走的东西越值钱越好,但他的背包中至多只能装下W磅的东西,W为一整数。应该带走哪几样东西?这个问题之所以称为0-1背包,是因为每件物品或被带走;或被留下;小偷不能只带走某个物品的一部分或带走同一物品两次。 注:在选择装入背包的物品时

zwpf1994的博客 3万+
下一篇: 动态规划--01背包
js睡觉
博客等级 码龄5年 15粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值