(C语言贪心算法)0/1背包问题

这篇具有很好参考价值的文章主要介绍了(C语言贪心算法)0/1背包问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  Description

已知一个载重为M的背包和n件物品,物品编号从0到n-1。第i件物品的重量为 wi,若将第i种物品装入背包将获益pi,这里,wi>0,pi>0,0<=i<n。所谓0/1背包问题是指在物品不能分割,只能整件装入背包或不装入的情况下,求一种最佳装载方案使得总收益最大。

Input

第 1 行中有 2 个正整数 n(n<=50)和M ,表示有 n件物品,背包载重为M(m<=100)。然后输入n个物品的重量,最后输入n个物品的收益值。

Output

最佳装载方案的总收益

Sample Input

3 6
2 3 4
1 2 4

Sample Output

5
方法:将规模大的问题转化为小问题。
过程:从第一个开始选,选出最优解,依次类推,求出第n个相应的最优解。
        
       
#include<stdio.h>

int max(int a,int b){
       return a>b?a:b;
}
int main()
{
    int n,m,i,j;
    scanf("%d%d",&n,&m);
    int w[n],p[n],f[200000]={0};
    for(i=0;i<n;i++) scanf("%d",&w[i]);
    for(i=0;i<n;i++) scanf("%d",&p[i]);
    
    for(i=0;i<n;i++){
    for(j=m;j>=1;j--){
    if(j>=w[i]) f[j]=max(f[j],f[j-w[i]]+p[i]);
    }
    }
    printf("%d",f[m]);
    return 0;
}
这里,我们举个列子,取n=3,M=3;(此处数据取小一点,便于理解)
        每个物体重量分别为1 2 1
        每个物体收益分别为3 4 5 
        f[W]是我们最后要求的答案,先把数组f全赋值为0,代表初始利润是0;
我们以i=0时做第一次循环得出相应结果为(j认为是背包中剩余可装重量)
(C语言贪心算法)0/1背包问题

 不难发现,在只对第一个物体进行选择时,不同背包容量都做出了最优选择。

接下来在进行i=1时的第二次循环,结果为:

(C语言贪心算法)0/1背包问题

 此处没有f[1]是因为1小于第二个物体重量。

i=2,最后一次循环结果为:(C语言贪心算法)0/1背包问题

 程序结束,这个程序是求了不同背包容量时对第1、2........n个物体选择时所求的最优解,既然每一小部分都是最优解。那加起来合为一个整体也一定为最优解,如最后一张图片,当背包容量为3时,最优解为9。当背包容量为2时,最优解为8。当背包容量为3时,最优解为5。但我们只需求背包容量为3时的最优解,所以输出f[3],即f[m].文章来源地址https://www.toymoban.com/news/detail-482628.html

到了这里,关于(C语言贪心算法)0/1背包问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【趣学算法】Day3 贪心算法——背包问题

    14天阅读挑战赛 努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!  ❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️ 🧑个人主页:@周小末天天开心 各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力 感谢! 📕该

    2024年02月02日
    浏览(31)
  • c++—0/1背包问题--贪心算法(详解)

    贪心算法的基本思想 •贪心算法的特点是每个阶段所作的选择都是局部最优的,它期望通过所作的局部最优选择产生出一个全局最优解。 贪心与动态规划: 与动态规划不同的是,贪心是 鼠目寸光 ; 动态规划是 统揽全局 。 贪心:每个阶段产生的都是局部最优解 贪心算法的

    2024年02月04日
    浏览(32)
  • 【程序设计竞赛算法】背包问题——贪心法

    贪心算法是一种基于贪心策略的算法,它在每一步选择中都采取当前状态下的最优选择,以期望最终达到全局最优解。 背包问题是一个经典的组合优化问题,可以分为 0-1 背包问题和分数背包问题。其中,0-1 背包问题要求物品只能选择一次,而分数背包问题允许物品被选择多

    2024年02月03日
    浏览(32)
  • java实现0-1背包问题方案(动态规划-贪心算法-回溯-分支定界)

    动态规划算法时间复杂度较低,能够求解较大规模的问题,但空间复杂度较高,不适用于数据量较大的问题。 贪心算法时间复杂度较低,能够求解较大规模的问题,但不能保证求得的解是最优解。 回溯算法能够求解较小规模的问题,但时间复杂度较高,不适用于数据量较大

    2024年02月01日
    浏览(92)
  • 湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题

    https://download.csdn.net/download/SQ_ZengYX/88620871 测试用例

    2024年02月02日
    浏览(45)
  • 背包问题(贪心)& 二维01背包问题 Java

    题目描述 有n件物品和一个最大承重为w 的背包。第i件物品的重量是weight[i],每件只能用一次,求装入背包的最多物品数量。 题目分析 因为我们 只要求装入物品的数量 ,所以 装重的显然没有装轻的划算 。 因此将 数组weight[i]按从小到大排序 , 依次选择每个物品 ,直到装不

    2024年01月17日
    浏览(31)
  • 贪心法解决背包问题

    贪心法的基本概念 (1)贪心法要解决的问题是这样的一类问题,有n个输入,问题的解由这n个输入的某个子集组成,同时要求这个子集必须满足某些事先给定的条件,这些必须满足的条件称为约束条件。 (2)满足约束条件的子集,被称为可行解。 (3)为了衡量可行解的优

    2024年02月10日
    浏览(20)
  • 0-1背包问题的多种算法求解(C语言)

            1.问题描述         有一个容量为V的背包,还有n个物体。现在忽略物体实际几何形状,我们认为只要背包的剩余容量大于等于物体体积,那就可以装进背包里。每个物体都有两个属性,即体积w和价值v。 使物品装入背包的价值最大。         2.解决思路与

    2024年02月10日
    浏览(25)
  • 基于贪心算法的TSP问题(c语言)

     data.txt 代码   

    2024年02月11日
    浏览(30)
  • 01背包(动态规划,贪心算法,回溯法,分支限界法)

    有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? number=4,capacity=8 物品编号(i) W(体积) V(价值) 1 2 3 2 3 4 3 4 5 4 5 6 1.什么是动态规划 1.动态规划算法是通过拆分问题,定义问题状态和状态之间的关系, 使得

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包