背包问题的贪心算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪心方法:总是对当前的问题作最好的选择,也就是局部寻优。最后得到整体最优。
应用:1:该问题可以通过“局部寻优”逐步过渡到“整体最优”。贪心选择性质与“动态规划”的主要差别。
2:最优子结构性质:某个问题的整体最优解包含了“子”问题的最优解。
代码如下:
#include
struct goodinfo
{
float p; //物品效益
float w; //物品重量
float X; //物品该放的数量
int flag; //物品编号
};//物品信息结构体
void Insertionsort(goodinfo goods[],int n)
{
int j,i;
for(j=2;j<=n;j++)
{
goods[0]=goods[j];
i=j-1;
while (goods[0].p>goods[i].p)
{
goods[i+1]=goods[i];
i--;
}
goods[i+1]=goods[0];
}
}//按物品效益,重量比值做升序排列
void bag(goodinfo goods[],float M,int n)
{
float cu;
for(i=1;i<=n;i++)
goods[i].X=0;
cu=M; //背包剩余容量
for(i=1;i { if(goods[i].w>cu)//当该物品重量大与剩余容量跳出break; goods[i].X=1; cu=cu-goods[i].w;//确定背包新的剩余容量 } if(i<=n) goods[i].X=cu/goods[i].w;//该物品所要放的量 /*按物品编号做降序排列*/ for(j=2;j<=n;j++) { goods[0]=goods[j]; i=j-1; while (goods[0].flag { goods[i+1]=goods[i]; i--; } goods[i+1]=goods[0]; } /////////////////////////////////////////// cout<<"最优解为:"< for(i=1;i<=n;i++) { cout<<"第"< cout< } } void main() { cout<<"|--------运用贪心法解背包问题---------|"< int n; float M; goodinfo *goods;//定义一个指针 while(j) { cout<<"请输入物品的总数量:"; cin>>n; goods=new struct goodinfo [n+1];// cout<<"请输入背包的最大容量:"; cin>>M; cout< int i; for(i=1;i<=n;i++) { goods[i].flag=i; cout<<"请输入第"< cin>>goods[i].w; cout<<"请输入第"< cin>>goods[i].p; goods[i].p=goods[i].p/goods[i].w;//得出物品的效益,重量比cout< } Insertionsort(goods,n); bag(goods,M,n); cout<<"press <1> to run agian"< cout<<"press <0> to exit"< cin>>j; } } #include #include #define Max 100/*定义栈结构*/ typedef struct list{ int data[Max]; int top;} Seqstack; /*定义一个用来存储结果的链表*/ typedef struct List{ Seqstack result; struct List * Next;} Seqlist,*Pointer; void Inicial_List(Pointer p) { p=(Pointer)malloc(sizeof(Seqlist)); p->Next=NULL;} Seqstack Push_Stack(int n,Seqstack s) { s.top++; s.data[s.top]=n; return s;} int Add_Stack(Seqstack s) { Int total=0,i; if(s.top>=0) { for(i=0;i<=s.top;i++) total+=s.data[i]; } else { total=0; } return total;} Seqstack Pop_Stack(Seqstack s) { printf("%d",s.data[s.top]); if(s.top>=0) s.top--; return s;}/*执行回溯操作的函数*//*参数说明:n->数的总的个数,a[]用来存放数的数组,k 查找的总体积*/ Pointer Query_Result(int n,int b[],int k) { int i,j; Seqstack mystack; Seqlist *newnode; Pointer r,p=NULL; Inicial_List(p); r=p; for(i=0;i { mystack.top=-1; j=i; while(j { if(Add_Stack(mystack)+b[j] { mystack=Push_Stack(b[j],mystack);