01背包之深度优先搜索法

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include<fstream>
using namespace std;
#define N 500
struct Bag
{
    int id;
    int w;
    int v;
    double wv;
};
int C,n,Wsum,Vsum,best;
struct Bag bag[N];
int tempans[N],ans[N];
int cmp(const void *a,const void *b)
{
    struct Bag *c = (Bag *) a;
    struct Bag *d = (Bag *) b;
    return c->wv<d->wv?1:-1;
};
double shangjie(int x)
{
    double tmp = Vsum;
    double left = C-Wsum;
    while(x<n&&bag[x].w<=left)
    {
        tmp+=bag[x].v;
        left-=bag[x].w;
        x++;
    }
    if(x<n)
    {
        tmp+=left*bag[x].wv;

    }
    return tmp;

}
void dfs(int x)
{
    if(x>=n)
    {
        if(Vsum>best)
        {
            best = Vsum;
            for(int i = 0; i<n; i++)
                ans[bag[i].id]=tempans[bag[i].id];
        }
        return;
    }
    if(Wsum+bag[x].w<=C)
    {
        Wsum+=bag[x].w;
        Vsum+=bag[x].v;
        tempans[bag[x].id]=1;
        dfs(x+1);
        Wsum-=bag[x].w;
        Vsum-=bag[x].v;
    }
    if(shangjie(x+1)>best)
    {
        tempans[bag[x].id]=0;
        dfs(x+1);
    }

}


int main()
{
    freopen("d:/2.in","r",stdin);
    scanf("%d %d",&C,&n);
    best = 0;
    Wsum=0;
    Vsum=0;
    memset(ans,0,sizeof(ans));
    memset(tempans,0,sizeof(tempans));
    int tempV= 0, tempW =0;//物品的全部重量与全部价值
    for(int i = 0; i<n; i++)
    {
        scanf("%d %d",&bag[i].w,&bag[i].v);
        bag[i].id=i;
        bag[i].wv = bag[i].v*1.0/bag[i].w;
        printf("%d %d\n",bag[i].w,bag[i].v);
        tempV += bag[i].v;
        tempW += bag[i].w;

    }
    if(tempV<=C)   //如果全部重量小于能承载的重量 那么全选
    {
        printf("%d\n",tempW);
        for(int i = 0; i<n; i++)
            printf("%d 1\n",i+1);
        return 0;
    }
    qsort(bag,n,sizeof(bag[0]),cmp); //按单位重量的价排序值


    /*for(int i = 0; i<n; i++)
    {

        printf("%d %d %d\n",bag[i].id,bag[i].w,bag[i].v);
    }*/

    dfs(0);
    printf("%d\n",best);
    for(int i = 0; i<n;i++)
    printf("%d %d\n",i+1,ans[i]);

}

posted @ 2012-12-04 23:54  0弓虽  阅读(148)  评论(0编辑  收藏  举报