回溯法

来源:互联网 发布:string.h 51单片机 编辑:程序博客网 时间:2024/06/03 05:19
#include <iostream>

using namespace std;

int cw=0;
int cp=0;
int bestc=-9999;
int c;
int n;
struct op
{
    int w;
    int v;
    int d;
}yu[100];


op ty[100];

int Bound(int i)
{
    int cleft=c-cw;
    int b=cp;
    while(i<=n&&ty[i].w<=cleft)
    {
        cleft=cleft-ty[i].w;
        b=b+ty[i].v;
        i++;
    }
    if(i<=n)
    {
        b+=ty[i].v*cleft/ty[i].w;
    }
    return b;

}
void backtack(int i)
{
    if(i>n)
    {
        if(bestc<cp)
        {
            bestc=cp;

        }
        return ;
        }
    if(cw+ty[i].w<=c)
    {
        cw=cw+ty[i].w;
        cp=cp+ty[i].v;
        backtack(i+1);
        cw=cw-ty[i].w;
        cp=cp-ty[i].v;

    }
    if(Bound(i+1)>bestc)
    {
        backtack(i+1);

    }




}
 void sort1(op yu[100],int m)
 {
     op temp;
     for(int i=1;i<m;i++)
     {
         for(int j=i+1;j<=m;j++)
         {
             if(yu[i].d<yu[j].d)
             {
                 temp=yu[i];
                 yu[i]=yu[j];
                 yu[j]=temp;
             }

         }

     }




 }











int main()
{
    cout<<"请输入物品个数"<<endl;

    cin>>n;
    cout<<"请输入重量"<<endl;
    cin>>c;


    for(int i=1;i<=n;i++)
    {
        cin>>ty[i].w>>ty[i].v;
        ty[i].d=ty[i].v/ty[i].w;
    }
    sort1(ty,n);
backtack(1);
cout<<bestc;

    return 0;
}

原创粉丝点击