求一道c语言背包tsp问题贪心算法c语言算法,只要求背包被装满,不要求物品价值

没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!0-1背包和背包问题(C语言实现)——贪心算法应用(3)
&&&&&&&&& 给定n种物品和一个背包。物品i的重量为w[i],其价值为v[i],背包的容量为c。应如何选择装入& 背包的物品,使得装入背包中的物品的总价值最大。每种物品最多装入一次。
&&&&&&&&& 0-1背包问题:对于要装入背包中的物品,只有两种选择:全部装入或者不装入。
&&&&&&&&& 背包问题:对于要装入背包中的物品,可以选择装入一部分,不一定要全部装入背包中。
算法分析:
&&&&&&&& 使用贪心策略求解此类问题时,首先要选出最优的度量标准。
&&&&&&&& 可供选择的度量标准有三种:价值,容量,单位价值(v/w,价值/重量)。
&&&&&&&& 显然,价值高的物品容量可能太大,容量大的物品价值也可能很低。最优的度量标准是单位价值。
背包问题算法思路:
&&&&&&&& 1、将各个物品按照单位价值由高到低排序;
&&&&&&&& 2、取价值最高者放入背包;
&&&&&&&& 3、计算背包的剩余空间;
&&&&&&&& 4、重复2-3步,直到背包剩余容量=0或者物品全部装入背包为止(对于0-1背包,终止条件为背包剩余容量无法装入任意一件物品或者物品全部装入背包)。
下面是C语言实现(DEV c++4.9.9.2运行通过)
#include&stdio.h&&&
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&);&
*& 背包问题&
*& n:物品个数&
*& c:背包容量&
*& v[]:每个物品的价值&
*& w[]:每个物品的重量(这里已经按照单位价值降序排列 )&
*& x[]:物品是否放入背包(0表示不放,1表示全部放入,0-1放入一部分)&
void package(int n,float c,float v[],float w[],float x[])&
&&&& for(i=0;i&n;i++)&
&&&&&&& x[i] = 0;//初始状态,所有物品都没有被放入背包&&&
&&&& for(i=0;i&n;i++)&
&&&&&& if(w[i] & c)&
&&&&&& 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]);&
&&&& }&&&&&&
*& 0-1背包问题&
*& n:物品个数&
*& c:背包容量&
*& v[]:每个物品的价值&
*& w[]:每个物品的重量(这里已经按照单位价值降序排列 )&
*& x[]:物品是否放入背包(0表示不放,1表示全部放入)&
void package0_1(int n,float c,float v[],float w[],float x[])&
&&&& for(i=0;i&n;i++)&
&&&&&&& x[i] = 0;//初始状态,所有物品都没有被放入背包&&&
&&&& for(i=0;i&n;i++)&
&&&&&& if(w[i] & c)&
&&&&&& x[i] = 1;&
&&&&&& c = c - w[i];&
&&&&&& printf(&放入第%d件物品,背包剩余容量%f.\n&,(i+1),c);&
#include&stdio.h&
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&);
*& 背包问题
*& n:物品个数
*& c:背包容量
*& v[]:每个物品的价值
*& w[]:每个物品的重量(这里已经按照单位价值降序排列 )
*& x[]:物品是否放入背包(0表示不放,1表示全部放入,0-1放入一部分)
void package(int n,float c,float v[],float w[],float x[])
&&&& for(i=0;i&n;i++)
&&&&&&& x[i] = 0;//初始状态,所有物品都没有被放入背包
&&&& for(i=0;i&n;i++)
&&&&&& if(w[i] & c)
&&&&&& 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]);
&&&& }&&&&
*& 0-1背包问题
*& n:物品个数
*& c:背包容量
*& v[]:每个物品的价值
*& w[]:每个物品的重量(这里已经按照单位价值降序排列 )
*& x[]:物品是否放入背包(0表示不放,1表示全部放入)
void package0_1(int n,float c,float v[],float w[],float x[])
&&&& for(i=0;i&n;i++)
&&&&&&& x[i] = 0;//初始状态,所有物品都没有被放入背包
&&&& for(i=0;i&n;i++)
&&&&&& if(w[i] & c)
&&&&&& x[i] = 1;
&&&&&& c = c - w[i];
&&&&&& printf(&放入第%d件物品,背包剩余容量%f.\n&,(i+1),c);
虽然背包问题和0-1背包都具有最优子结构性质,但是背包问题用贪心算法求出来的是最优解,0-1背包问题通过贪心算法得不到最优解,因为无法保证最后能将背包装满,部分闲置的背包空间使总价值降低了。}

我要回帖

更多关于 01背包问题c语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信