• 贪心算法or背包问题


    贪心方法:总是对当前的问题作最好的选择,也就是局部寻优。最后得到整体最优。

    应用:1:该问题可以通过局部寻优逐步过渡到整体最优。贪心选择性质与动态规划的主要差别。

    2:最优子结构性质:某个问题的整体最优解包含了问题的最优解。

    程序1

      1 #include <iostream.h>
      2 struct goodinfo
      3 {
      4  float p; //物品效益
      5  float w; //物品重量
      6  float X; //物品该放的数量
      7  int flag; //物品编号
      8 };//物品信息结构体
      9 
     10 void Insertionsort(goodinfo goods[],int n)
     11 {
     12  int j,i;
     13  for(j=2;j<=n;j++)
     14  {
     15   goods[0]=goods[j];
     16      i=j-1;
     17   
     18   while (goods[0].p>goods[i].p)
     19   {
     20    goods[i+1]=goods[i];
     21    i--;
     22   }
     23   goods[i+1]=goods[0];
     24  }
     25 }//按物品效益,重量比值做升序排列
     26 
     27 void bag(goodinfo goods[],float M,int n)
     28 { 
     29  
     30  float cu;
     31  int i,j;
     32  for(i=1;i<=n;i++)
     33   goods[i].X=0;
     34  cu=M;  //背包剩余容量
     35  for(i=1;i<n;i++)
     36  {
     37   if(goods[i].w>cu)//当该物品重量大与剩余容量跳出
     38    break;
     39   
     40    goods[i].X=1;
     41    cu=cu-goods[i].w;//确定背包新的剩余容量
     42  }
     43  if(i<=n)
     44   goods[i].X=cu/goods[i].w;//该物品所要放的量
     45 /*按物品编号做降序排列*/ 
     46  for(j=2;j<=n;j++)
     47  {
     48   goods[0]=goods[j];
     49      i=j-1;
     50   
     51   while (goods[0].flag<goods[i].flag)
     52   {
     53    goods[i+1]=goods[i];
     54    i--;
     55   }
     56   goods[i+1]=goods[0];
     57  }
     58 ///////////////////////////////////////////
     59  cout<<"最优解为:"<<endl;
     60  for(i=1;i<=n;i++)
     61  {
     62   cout<<""<<i<<"件物品要放:";
     63   cout<<goods[i].X<<endl;
     64  }
     65 }
     66 
     67 void main()
     68 { 
     69  cout<<"|--------运用贪心法解背包问题---------|"<<endl;
     70  cout<<"|---power by zhanjiantao(028054115)---|"<<endl;
     71  cout<<"|-------------------------------------|"<<endl;
     72  int j;
     73  int n;
     74  float M;
     75  goodinfo *goods;//定义一个指针
     76  while(j)
     77  {
     78  cout<<"请输入物品的总数量:";
     79  cin>>n;
     80  goods=new struct goodinfo [n+1];//
     81  cout<<"请输入背包的最大容量:";
     82  cin>>M;
     83  cout<<endl;
     84  int i;
     85  for(i=1;i<=n;i++)
     86   { goods[i].flag=i;
     87    cout<<"请输入第"<<i<<"件物品的重量:";
     88    cin>>goods[i].w;
     89    cout<<"请输入第"<<i<<"件物品的效益:";
     90    cin>>goods[i].p;
     91    goods[i].p=goods[i].p/goods[i].w;//得出物品的效益,重量比
     92    cout<<endl;
     93    
     94   }
     95  
     96  Insertionsort(goods,n);
     97  bag(goods,M,n);
     98  cout<<"press <1> to run agian"<<endl;
     99  cout<<"press <0> to exit"<<endl;
    100  cin>>j;
    101  }
    102 }

    程序2

    #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
    "); 
    if(p==NULL)
    printf("there no results
    "); 
    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("
    "); } 
    printf("
    ");}
    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("******************************************
    "); printf("1 start
    2 exit
    "); 
     scanf("%d",&select); 
      while(select==1) 
     {   
    printf("please input the total products
    ");  
     scanf("%d",&n);  
     printf("please input the volumn of n products
    ");
       for(i=0;i<n;i++)  
     {   
     printf("please input the %d integers",i+1);   
     scanf("%d",&a[i]);   
    } 
      printf("
    ");  
     printf("please input the volunm to put
    ");   
    scanf("%d",&k);
       Sort_Array(a,n);   
    head=Query_Result(n,a,k);   
    Print_List(head);  
     printf("******************************************
    "); 
      printf("1 start
    2 exit
    ");   scanf("%d",&select);
      }
     }
    View Code

    程序3

    #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
    ");
     if(p==NULL)
    printf("there no results
    "); 
    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("
    "); 
    }
     printf("
    ");
    }
    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("******************************************
    "); 
    printf("1 start
    2 exit
    ");  scanf("%d",&select);  
     while(select==1)  
    { 
      printf("please input the total products
    "); 
      scanf("%d",&n); 
      printf("please input the volumn of n products
    ");  
     for(i=0;i<n;i++)  
     {  
      printf("please input the %d integers",i+1);   
     scanf("%d",&a[i]);   }   printf("
    ");   
    printf("please input the volunm to put
    ");   
    scanf("%d",&k);   Sort_Array(a,n);   
    head=Query_Result(n,a,k);  
     Print_List(head); 
      printf("******************************************
    ");  
     printf("1 start
    2 exit
    ");  
     scanf("%d",&select); 
     } 
    }
    View Code
  • 相关阅读:
    Day 22 初识面向对象
    Day 21 内存处理与正则
    Day 20 常用模块(三)
    Day 18 常用模块(二)
    url解析
    jQuery---扩展事件
    jQuery---文档操作
    jQuery---属性操作
    jQuery---基本语法
    CSS---常用属性总结
  • 原文地址:https://www.cnblogs.com/fickleness/p/3148966.html
Copyright © 2020-2023  润新知