手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C 程式设计例解(05)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
05. 从n个不同价值、不同重量的物品中选取一部分,在不超过限定的总重量的前提下,使该部分的价值最大。这里假定的总重量不超过n个物品的总重量总和,且没有相同物品的重量超过限定的总重量。
解:
这个问题是求最好解的典型例子。为找最好解,需生成任何可能的解。在生成这些解的同时,保留一个指定意义下的当前最好解,当发现一个更好的解时,就把这个解改为当前最好解,并保留之。
现给出一组n个物品中找出满足约束条件的最好解的通例。为便于构造算法,采用递归方法。构成可接受解的任何选择是通过依次考察组中的各个物品的结果,对每个物品的考察均有两种可能:或所考察的物品被包括在当前选择中,或所考察的物品不被包括在当前选择中。递归函数是描述指定物品被包括或不被包括在当前选择中的计算过程,只要指定物品被包括后重量满足约束条件,该物品被包括是应该被考虑的;仅当一个物品如不被包括也可能达到比当前最好解所达到的总价值大时,为满足重量的限制,不把该物品包含在当前选择中也是应该被考虑的。为此,递归函数设有三个参数:指定的物品、当前选择已达到的总重量和可能达到的总价值。下面的递归算法就是考察某个物品在当前选择中是否被包括的计算过程描述。
算法---物品i在当前选择中被包括和否的递归算法
try(物品i,当前选择已达到的总重量tw,可能达到的总价值tv)
{
/*考察当前选择包含物品i的合理性*/
if(包含物品i是可接受的)
{
将物品i包括在当前解中;
if(i<n-1(try(i 1,tw 物品i的重量,tv);
else
调整当前最好解;
将物品i从当前解中消去;
}
/*考察当前选择不包含物品i的合理性*/
if(i<n-1)try(i 1,tw,tv-物品i的价值);
else
调整当前最好解;
}
对当前选择而言,“包含物品i是可接受的”准则是他被包括后,有可能达到的总价值也不小于当前最好解所达到的价值,因为假如小于的话,继续考察下去也不会产生更好的解。

程式代码如下:
#include<stdio.h>
#define N 100
double limw, /*物品的约束重量*/
totv, /*全部物品的总价值*/
maxv; /*解的总价值*/
int opts[N], /*当前最好选择*/
cs[N]; /*当前选择*/
int n, /*物品数*/
k; /*工作变量*/
struct{
double weight; /*物品的重量*/
double value; /*物品价值*/
}a[N]; /*一组物品*/
void tryy(int i,double tw,double tv)
{
/*考察当前选择物品i的合理性*/
if(tw a[i].weight<=limw) /*包含物品i是可接受的*/
{
cs[i]=1; /*将物品i包括在当前解中*/
if(i<n-1)tryy(i 1,tw a[i].weight,tv);
else
if(tv>maxv)
{ /*调整当前最好解*/
for(k=0;k<=i;k )
opts[k]=cs[k];
maxv=tv;
}
cs[i]=0; /*将物品i从当前解中消去*/
}
/*考察当前选择不包含物品i的合理性*/
if(tv-a[i].value>maxv) /*不包含物品i是可接受的*/
if(i<n-1)
tryy(i 1,tw,tv-a[i].value);
else
{ /*调整当前最好解*/
for(k=0;k<=i;k )
opts[k]=cs[k];
maxv=tv-a[i].value;
}
}
void main()
{
printf("Enter number of mails.\n");
scanf("%d",&n);
printf("Enter limit of weight.\n");
scanf("%lf",&limw);
printf("Enter weight and value of mails.\n");
for(k=0;k<n;k )
scanf("%lf%lf",&a[k].weight,&a[k].value);
for(totv=0.0,k=0;k<n;k )
totv =a[k].value;
maxv=0;
for(k=0;k<n;k )
opts[k]=cs[k]=0;
tryy(0,0,totv);
for(k=0;k<n;k )
if(opts[k])
printf("M",k 1);
printf("\nTotal value = %lf\n",maxv);
}

程式运行结果如下:




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS