【C语言】——背包问题详解「建议收藏」

【C语言】——背包问题详解「建议收藏」1.题目描述:——背包问题有若干物品,每种物品的价值和重量各不相同,将物品装入一个容量有限的背包,如何选择装入的物品,使背包的价值最大。2.题目分析:要是背包中的物品价值最大,则需要在有限的重量中尽可能装入价值更大的物品,基于这种思想则采取贪心算法首先计算物品的单位价值,即价值/重量,根据单位价值对物品进行排序,优先装入单位价值高的物品,直至背包装满。3.代码实现:#include<stdio.h>intn;//物品数量doublec;//背包容量…

大家好,又见面了,我是你们的朋友全栈君。

1.题目描述:——背包问题

有若干物品,每种物品的价值和重量各不相同,将物品装入一个容量有限的背包,如何选择装入的物品,使背包的价值最大。

2.题目分析:

要是背包中的物品价值最大,则需要在有限的重量中尽可能装入价值更大的物品,基于这种思想则采取贪心算法
       首先计算物品的单位价值,即价值/重量,根据单位价值对物品进行排序,优先装入单位价值高的物品,直至背包装满。

3.代码实现:

#include <stdio.h>
int n;//物品数量
double c;//背包容量
double v[999];//物品的价值
double w[999];//物品的重量
double cw = 0.0;//背包重量
double cp = 0.0;//背包价值
double bestp = 0.0;//当前最优价值
double perp[999];//物品性价比排序
int order[100];//物品编号
int put[100];//装入标识
void sort()
{
   int i,j;
   int temporder = 0;
   double temp= 0.0;
   for(i=1;i<=n;i++)
       perp[i]=v[i]/w[i];
   for(i=1;i<=n-1;i++)
    {
       for(j=i+1;j<=n;j++)
           if(perp[i]<perp[j])//冒泡排序perp[],order[],sortv[],sortw[]
       {
           temp = perp[i];
           perp[i]=perp[j];
           perp[j]=temp;
           temporder=order[i];
           order[i]=order[j];
           order[j]=temporder;
           temp = v[i];
           v[i]=v[j];
           v[j]=temp;
           temp=w[i];
           w[i]=w[j];
           w[j]=temp;
       }
    }
}
void backtrack(int i)
{
    double bound(int i);
   if(i>n)
    {
       bestp = cp;
       return;
    }
   if(cw+w[i]<=c)
    {
       cw+=w[i];
       cp+=v[i];
       put[i]=1;
       backtrack(i+1);
       cw-=w[i];
       cp-=v[i];
    }
   if(bound(i+1)>bestp)
       backtrack(i+1);
}
double bound(int i)
{
    double leftw= c-cw;
    double b =cp;
   while(i<=n&&w[i]<=leftw)
    {
       leftw-=w[i];
       b+=v[i];
       i++;
    }
   if(i<=n)
       b+=v[i]/w[i]*leftw;
    return b;
}
int main()
{
   int i;
   printf("请输入物品的数量和容量:");
   scanf("%d%lf",&n,&c);
   for(i=1;i<=n;i++)
    {
       printf("第%d个物品的重量和价值:",i);
       scanf("%lf %lf",&w[i],&v[i]);
       order[i]=i;
    }
   sort();
   backtrack(1);
   printf("最大价值为:%lf\n",bestp);
   printf("装入的物品次序为:");
   for(i=1;i<=n;i++)
    {
       if(put[i]==1)
           printf("%d ",order[i]);
    }
    return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159137.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CSDN前1000名博主[通俗易懂]

    CSDN前1000名博主[通俗易懂]博主简介stpeace排名:1原创:2166粉丝:7180积分:181660等级:10stpeace的专栏中国本博客供大家交流,欢迎各抒己见。博文中的内容禁止用yuanmeng001排名:2原创:5286粉丝:10660积分:170616等级:10袁萌专栏无穷小微积分倡导者–北大教授null老师yjclsx排名:3原创:162…

    2022年8月12日
    8
  • c酒店管理系统代码_酒店管理系统

    c酒店管理系统代码_酒店管理系统主要功能:1.添加员工信息2.显示员工信息3.删除员工信息4.修改员工信息5.查找员工信息6.员工信息排序7.清空数据(1)显示数据(2)修改数据(3)查找数据(4)信息排序部分代码展示:workerManager.cpp。需要完整代码可以留邮箱,有时间就发#include”stdafx.h”#include”work…

    2022年9月24日
    0
  • js 二维数组 添加json数据及js数组与json字符串「建议收藏」

    js 二维数组 添加json数据及js数组与json字符串「建议收藏」 JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,JSON是JavaScript原生数据格式。下面给大家介绍js数组添加json数据的两种方式。//第一种方式? 1 2 3 4 5 6 7 personInfo :[],…

    2022年5月27日
    96
  • 两人下象棋_双人五子棋同屏

    两人下象棋_双人五子棋同屏阅读本文前,请您先点击右上角的蓝色字体“优课屋”,再点击“关注”,这样您就可以继续订阅文章了!(国际象棋怎么玩)在我门的生活中,棋类游戏种类非常的多,其中我们最常玩的棋类游戏有中国象棋,中国跳棋,五子棋,围棋,军棋的。而最近这几年我们很多人都接触到了国际象棋这个游戏,国际象棋其实和中国象棋有很多相似的地方,很多玩家也都特别喜欢玩国际象棋这个游戏。我们现在可以非常方便的在我们身边的网络棋牌…

    2022年8月29日
    0
  • navicat premium15激活码【永久激活】「建议收藏」

    (navicat premium15激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
    190
  • 【牛刀小试2】password保

    【牛刀小试2】password保

    2022年1月15日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号