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;
}