永发信息网

c语言背包问题

答案:1  悬赏:10  手机版
解决时间 2021-11-07 03:27
c语言背包问题
最佳答案
算法分析:
使用贪心策略求解此类问题时,首先要选出最优的度量标准。
可供选择的度量标准有三种:价值,容量,单位价值(v/w,价值/重量)。
显然,价值高的物品容量可能太大,容量大的物品价值也可能很低。最优的度量标准是单位价值。
背包问题算法思路:
1、将各个物品按照单位价值由高到低排序;
2、取价值最高者放入背包;
3、计算背包的剩余空间;
4、重复2-3步,直到背包剩余容量=0或者物品全部装入背包为止(对于0-1背包,终止条件为背包剩余容量无法装入任意一件物品或者物品全部装入背包)。
#include

void package(int n,float c,float v[],float w[],float x[]);
void package0_1(int n,float c,float v[],float w[],float x[]);

int main(void)
{
int n = 3;
float c = 20;
float v[] = {24,15,25};
float w[] = {15,10,18};//已经按照单位价值降序排列
float *x;
x = (float*)malloc(sizeof(float)*n);
printf("******背包*******\n");
package(n,c,v,w,x);
printf("*******0-1背包******\n");
package0_1(n,c,v,w,x);
system("PAUSE");

}


void package(int n,float c,float v[],float w[],float x[])
{
int i;
for(i=0;i{
x[i] = 0;//初始状态,所有物品都没有被放入背包
}

for(i=0;i{
if(w[i] > c)
{
break;
}

x[i] = 1;
c = c - w[i];
printf("放入第%d件物品,背包剩余容量%f.\n",(i+1),c);
}

if(i<=n)//还可以放入一个物品的一部分
{
x[i] = c/w[i];

printf("放入第%d件物品的%f部分.背包剩余容量为0.\n",(i+1),w[i]*x[i]);
}
}


void package0_1(int n,float c,float v[],float w[],float x[])
{
int i;
for(i=0;i{
x[i] = 0;//初始状态,所有物品都没有被放入背包
}

for(i=0;i{
if(w[i] > c)
{
break;
}

x[i] = 1;
c = c - w[i];
printf("放入第%d件物品,背包剩余容量%f.\n",(i+1),c);
}
}

#include
void package(int n,float c,float v[],float w[],float x[]);
void package0_1(int n,float c,float v[],float w[],float x[]);
int main(void)
{
int n = 3;
float c = 20;
float v[] = {24,15,25};
float w[] = {15,10,18};//已经按照单位价值降序排列
float *x;
x = (float*)malloc(sizeof(float)*n);
printf("******背包*******\n");
package(n,c,v,w,x);
printf("*******0-1背包******\n");
package0_1(n,c,v,w,x);
system("PAUSE");
}

void package(int n,float c,float v[],float w[],float x[])
{
int i;
for(i=0;i{
x[i] = 0;//初始状态,所有物品都没有被放入背包
}

for(i=0;i{
if(w[i] > c)
{
break;
}

x[i] = 1;
c = c - w[i];
printf("放入第%d件物品,背包剩余容量%f.\n",(i+1),c);
}

if(i<=n)//还可以放入一个物品的一部分
{
x[i] = c/w[i];

printf("放入第%d件物品的%f部分.背包剩余容量为0.\n",(i+1),w[i]*x[i]);
}
}

void package0_1(int n,float c,float v[],float w[],float x[])
{
int i;
for(i=0;i{
x[i] = 0;//初始状态,所有物品都没有被放入背包
}

for(i=0;i{
if(w[i] > c)
{
break;
}

x[i] = 1;
c = c - w[i];
printf("放入第%d件物品,背包剩余容量%f.\n",(i+1),c);
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
上海娱果文化传播有限公司怎么样?
南京到嘉兴的火车多少钱都是几点的路过的也行
有没有在多融财富被骗的?
福寿得手工面馆这个地址在什么地方,我要处理
万象由心生,喜怒由心定的出自《无常经》吗
八年级数学,求学神解决
仙境幻想的游戏评价
求助怀孕40天怀疑宫外孕
从台山出发到汕尾市座什么车方便快省钱?
AIMgSi1是什么材质
在风水上看结婚床能拆开从新做吗
2.55÷1.7-0.7简便
有什么好的日本直购网站?
女生腋下长毛怎么回事?
通辽机场的介绍
推荐资讯
开车从南三环方庄桥到工人体育场南门富国海底
(y+2)平方=(2y-1)平方
探天下安检门怎么使用?
我女儿的名字叫紫凌,这个名字意思如何解释
以一次有趣的什么写2篇作文(要生活中的)
垂钓鲢鳙的温度
以铜为镜可以正衣冠以史为镜可以知兴替以人为
IE10无法显示网页,整个页面都是白色的
想问装宽带,家庭和办公(有什么区别)
今天看上两款电源,二手台达,一个单路12V 28
每天早上起来腰部像扭伤一样转身都会痛是怎么
面试安检时说自己的性格怎么说好
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?