分布估计算法求解0-1背包问题算法的C语言程序;

背包问题描述现有n种物品,对,已知第i种物品的重量为正整数,价值为正整数,背包能承受的最大载重量为正整数W,现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过W... 背包问题描述

现有n种物品,对,已知第i种物品的重量为正整数,价值为正整数,背包能承受的最大载重量为正整数W,现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过W且总价值尽量大。对每种物品只有两种选择,可以选择放与不放。即当物件被选入背包时,定义变量=1,否则=0。
展开
 我来答
Go浪人生
2012-03-23 · TA获得超过2471个赞
知道小有建树答主
回答量:738
采纳率:100%
帮助的人:895万
展开全部
思路是:
1、先将所有东西按价值和重量的比值(价重比)从大到小排列。这里我用的冒泡排序。
2、将价重比大的先放到背包里。直到背包不能再放为止。此时价格就是最大的。

你应该能看懂。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LIMIT 100
#define TN 20

typedef struct{
int weight; //东西的重量
int value; // 东西的价值
int selected; // 是否放进去
}Things;

void swap_things(Things *t1, Things *t2) // 只是一个交换函数而已。
{
int weight, value, selected;
weight=t1->weight;
value=t1->value;
selected=t1->selected;
t1->weight=t2->weight;
t1->value=t2->value;
t1->selected=t2->selected;
t2->weight=weight;
t2->value=value;
t2->selected=selected;
}

void sort_things(Things t[], int n) // 排序函数,按照价重比排序(价格与重量的比值)
{
int i,j;
double vpw1=0, vpw2=0;
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--)
{
vpw1=(double)t[j].value/t[j].weight; //求出第 j 个东西的价重比
vpw2=(double)t[j-1].value/t[j-1].weight; // 求出第j-1个东西的价重比
if(vpw1>vpw2) // 如果第 j 个的价重比大于 第 j-1个价重比,则将这两个东西的位置调换一下。
swap_things(&t[j],&t[j-1]);
}
}
}

void select_things(Things t[], int n, int limit) // 这个函数用来选择要放进去的东西
{
int w=0, v=0,i;
for(i=0;i<n;i++)
{
if(w+t[i].weight>limit) // 如果目前所有放进去的东西的重量大于限制的重量,就不放东西了
break;
w+=t[i].weight; // 计算目前所有放进去的东西的重量
v+=t[i].value; // 计算目前所有放进去的东西的价格
t[i].selected=1; // 把这个东西标记为放进去了
}
printf("totel: weight=%d, value=%d\n",w,v); // 打印放进去的东西的总重量和总价格
}

int main(void)
{
Things t[TN];
int i;
srand((unsigned)time(NULL));
for(i=0;i<TN;i++) // 初始化所有的东西的重量和价格
{
t[i].weight=rand()%TN+1;
t[i].value=rand()%TN+1;
t[i].selected=0;
}

sort_things(t,TN);
select_things(t,TN,LIMIT);
printf("weight\tvalue\tselected\n");
for(i=0;i<TN;i++) // 打印所有东西的重量、价格和是否放进去。
printf("%d\t%d\t%d\n",t[i].weight,t[i].value,t[i].selected);

return 0;
}
上海华然企业咨询
2024-10-23 广告
上海华然企业咨询有限公司专注于AI与数据合规咨询服务。我们的核心团队来自头部互联网企业、红圈律所和专业安全服务机构。凭借深刻的AI产品理解、上百个AI产品的合规咨询和算法备案经验,为客户提供专业的算法备案、AI安全评估、数据出境等合规服务,... 点击进入详情页
本回答由上海华然企业咨询提供
xu3180497
2012-03-22 · TA获得超过1659个赞
知道小有建树答主
回答量:390
采纳率:66%
帮助的人:187万
展开全部
#include<iostream>
#include<string>
using namespace std;
int mVal,nVal;
int sum;
int *pOut;
void calFun(int m,int n)
{
if(m<1||n<1||(n==1&&m!=1))
return;
if(m==n)
{
pOut[n]=1;
for(int i=1;i<nVal;i++)
{
if(pOut[i])
cout<<i<<" ";
}
cout<<endl;
pOut[n]=0;
++sum;
}
calFun(m,n-1);
pOut[n]=1;
calFun(m-n,n-1);
pOut[n]=0;
}
int main(int argc,char *argv[])
{
cout<<"m:";
cin>>mVal;
cout<<"n:";
cin>>nVal;
if(mVal<nVal) nVal=mVal;
pOut=new int[nVal+1];
memset(pOut,0,(nVal+1)*sizeof(int));
calFun(mVal,nVal);
cout<<"总数:"<<sum<<endl;
delete []pOut;
return 0;
}
追问
这是用分布估计算法写出的程序吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式