贪心方法:总是对当前的问题作最好的选择,也就是局部寻优。
最后得到整体最优。
应用:1:该问题可以通过“局部寻优”逐步过渡到“整体最优”。
贪心选择性质与“动态规划”的主要差别。
2:最优子结构性质:某个问题的整体最优解包含了“子”问题的最优解。
代码如下:#include <iostream.h>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<n;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].flag){goods[i+1]=goods[i];i--;}goods[i+1]=goods[0];}///////////////////////////////////////////cout<<"最优解为:"<<endl;for(i=1;i<=n;i++){cout<<"第"<<i<<"件物品要放:";cout<<goods[i].X<<endl;}}void main(){cout<<"|--------运用贪心法解背包问题---------|"<<endl; cout<<"|---power by zhanjiantao(028054115)---|"<<endl; cout<<"|-------------------------------------|"<<endl;int n;float M;goodinfo *goods;//定义一个指针while(j){cout<<"请输入物品的总数量:";cin>>n;goods=new struct goodinfo [n+1];//cout<<"请输入背包的最大容量:";cin>>M;cout<<endl;int i;for(i=1;i<=n;i++){ goods[i].flag=i;cout<<"请输入第"<<i<<"件物品的重量:";cin>>goods[i].w;cout<<"请输入第"<<i<<"件物品的效益:";cin>>goods[i].p;goods[i].p=goods[i].p/goods[i].w;//得出物品的效益,重量比cout<<endl;}Insertionsort(goods,n);bag(goods,M,n);cout<<"press <1> to run agian"<<endl;cout<<"press <0> to exit"<<endl;cin>>j;}}#include<stdio.h>#include<stdlib.h>#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<n;i++){ mystack.top=-1;j=i;while(j<n){if(Add_Stack(mystack)+b[j]<k){ mystack=Push_Stack(b[j],mystack);j++; }else if(Add_Stack(mystack)+b[j]==k) { mystack=Push_Stack(b[j],mystack);newnode=(Pointer)malloc(sizeof(Seqlist)); newnode->result=mystack;newnode->Next=NULL;r->Next=newnode;r=newnode;mystack=Pop_Stack(mystack);j++;}else if(Add_Stack(mystack)+b[j]>k){j++;}}}return p;}void Print_List(Pointer p){int i,j=0;p=p->Next;printf("welcome the outer\n");if(p==NULL)printf("there no results\n");while(p!=NULL){j++;printf("the %d result is: ",j);for(i=0;i<=p->result.top;i++){ printf(" %d",p->result.data[i]);}p=p->Next;printf("\n"); }printf("\n");}void Sort_Array(int b[],int n){int i,j,temp;for(i=0;i<n;i++){ for(j=0;j<n-i;j++){ if(b[j]<b[j+1]){ temp=b[j];b[j]=b[j+1];b[j+1]=temp;}}}}void main(){int i,n,k,select,a[Max];Pointer head;printf("******************************************\n"); printf("1 start\n2 exit\n"); scanf("%d",&select);while(select==1){printf("please input the total products\n");scanf("%d",&n);printf("please input the volumn of n products\n");for(i=0;i<n;i++){printf("please input the %d integers",i+1);scanf("%d",&a[i]);}printf("\n");printf("please input the volunm to put\n");scanf("%d",&k);Sort_Array(a,n);head=Query_Result(n,a,k);Print_List(head);printf("******************************************\n");printf("1 start\n2 exit\n"); scanf("%d",&select);}}#include<stdio.h>#include<stdlib.h>#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<n;i++){mystack.top=-1;j=i;while(j<n){if(Add_Stack(mystack)+b[j]<k){mystack=Push_Stack(b[j],mystack);j++;}else if(Add_Stack(mystack)+b[j]==k){mystack=Push_Stack(b[j],mystack);newnode=(Pointer)malloc(sizeof(Seqlist)); newnode->result=mystack;newnode->Next=NULL;r->Next=newnode;r=newnode;mystack=Pop_Stack(mystack);j++;}else if(Add_Stack(mystack)+b[j]>k){j++;}}}return p;}void Print_List(Pointer p){int i,j=0;p=p->Next;printf("welcome the outer\n");if(p==NULL)printf("there no results\n");while(p!=NULL){j++;printf("the %d result is: ",j);for(i=0;i<=p->result.top;i++){printf(" %d",p->result.data[i]);}p=p->Next;printf("\n");}printf("\n");}void Sort_Array(int b[],int n){int i,j,temp;for(i=0;i<n;i++) { for(j=0;j<n-i;j++){if(b[j]<b[j+1]){temp=b[j];b[j]=b[j+1];b[j+1]=temp;}}}}void main(){int i,n,k,select,a[Max]; Pointer head;printf("******************************************\n"); printf("1 start\n2 exit\n"); scanf("%d",&select);while(select==1){printf("please input the total products\n");scanf("%d",&n);printf("please input the volumn of n products\n");for(i=0;i<n;i++){printf("please input the %d integers",i+1);scanf("%d",&a[i]); } printf("\n");printf("please input the volunm to put\n");scanf("%d",&k); Sort_Array(a,n);head=Query_Result(n,a,k);Print_List(head);printf("******************************************\n"); printf("1 start\n2 exit\n");scanf("%d",&select);}}。