【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)
上一篇 2022年7月14日 上午6:00
下一篇 2022年7月14日 上午6:16


相关推荐

  • Python:Flask使用jsonify格式化时间

    Python:Flask使用jsonify格式化时间代码如下#-*-coding:utf-8-*-fromdatetimeimportdatetime,datefromflask.jsonimportJSONEncoderclassCustomJSONEncoder(JSONEncoder):defdefault(self,obj):ifisinstance(obj,datetime):returnobj.strftime(‘%Y-%m-%d%H:%M:%

    2022年5月20日
    82
  • DDR2 ODT_ddr vtt电压

    DDR2 ODT_ddr vtt电压

    经常有人会说支持DDR2的主板存在偷工减料的现象。事实上这是由于DDR2内存中使用了一项新的ODT技术,它可以在提高内存信号稳定性的基础上节省不少电器元件(个人想法:ODT会增加功耗的阿)。主板终结是一种最为常见的终结主板内干扰信号的方法。在每一条信号传输路径的末端,都会安置一个终结电阻,它具备一定的阻值可以吸收反射回来的电子。但是目前DDR2内存的工作频率太高了,这种主板终结的方法并不能有效的阻止干扰信号。若硬要采用主板终结的方法得到纯净的DDR2时钟信号会花费巨额的制造成本。

    2025年10月13日
    4
  • java栈方法_java栈的两种实现方法[通俗易懂]

    java栈方法_java栈的两种实现方法[通俗易懂]java栈的实现有两种方式:一.使用数组来实现://使用数组实现栈,功能包括进行内存扩展publicclassStack{privateint[]data;privateintlength;//表示初始化栈的内存长度privateinttop;//用来表示栈的实际长度privatefinalintexpandLength=20;//表示扩展的长度publicStack(i…

    2025年9月19日
    7
  • 腾讯AI,加速狂飙的这半年

    腾讯AI,加速狂飙的这半年

    2026年3月12日
    1
  • Badboy录制脚本出现的问题

    Badboy录制脚本出现的问题badboy 中这个错误怎么解决 http zhidao baidu com link url iEEhQrBcTD wPCNKGFLfRg5 ERCJmGKbadbo 录制测脚本带有弹出框 jmeter 运行时报错 http b

    2026年3月17日
    2
  • redis 6379端口不通解决方法「建议收藏」

    redis 6379端口不通解决方法「建议收藏」1.reids服务器的6379端口telnet不通2. 查看reids进程和端口,都是存在的。只是ip地址是127.0.0.1而不是0.0.0.0,只是本机能使用3.查找redis的配置文件redis.conf 使用命令:find/-nameredis.conf 4.查找bind127.0.0.1所在的行数  使用命令:cat/usr/local/re…

    2022年5月9日
    162

发表回复

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

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