回溯法-类型1-子集树

0 1 背包问题
递归
求满足两个条件的子集树
 
#include<stdio.h>
#define N 3
#define C 15
int w[N]={10,8,5};
int v[N]={5,4,1};
int x[N]={0,0,0};
 
int cur_weight = 0;
int cur_value = 0;
 
int best_value=0;
int bestx[N]={0,0,0};
void backtrack(int t)
{
    if(t>N-1)
    {
        if(cur_value>best_value)
        {
            best_value=cur_value;
            int z=0;
            for(z=0;z<N;z++)
            {
                bestx[z]=x[z];
            }
        }
    }
    else
    {
        int z=0;
        for(z=0;z<=1;z++)
        {
            x[t]=z;
            if(z==0)
            {
                backtrack(t+1);
            }
            else
            {
                if((cur_weight+w[t])<=C)
                {
                    cur_value+=v[t];
                    cur_weight+=w[t];
                    backtrack(t+1);
                    cur_value-=v[t];
                    cur_weight-=w[t];
                }
            }
 
        }
    }
}
int main()
{
    backtrack(0);
    printf("%d\n",best_value);
    for(int x=0;x<3;x++)
    {
        printf("%d\n",bestx[x]);
    }
    return 0;
}

 

posted @ 2015-09-30 16:54  hitz&x  阅读(141)  评论(0编辑  收藏  举报