0-1背包问题:给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应该如何选择物品放入包中,使得装入背包的物品的总价值最大?
回溯法:
#include <stdio.h>
int c; //背包容量
int n; //物品数量
int *w; //各物品重量
int *p; //各物品价值
int *x; //解向量
int cw; //当前重量
int cp; //当前价值
int bestp; //当前最优价值
int *bestx; //当前最优价值对应的解
void Backtrack(int t) //回溯算法
{ if (t>n-1)
{ if (cp>bestp)
{ bestp=cp;
for (int i=0; i<n; i++)
bestx[i]=x[i];
}
}
else
{
for (int i=0; i<=1; i++)
{
x[t]=i;
if (i==0) //右分支
Backtrack(t+1);
else
if(cw+w[t]<=c) //左分支
{
cw=cw+w[t];
cp=cp+p[t];
Backtrack(t+1);
cw=cw-w[t];
cp=cp-p[t];
}
}
}
}
int main()
{ int i;
int pd[5]={6,3,5,4,6};
int wd[5]={2,2,6,5,4};
c=10; n=5; cw=cp=bestp=0;
w=new int[n];
p=new int[n];
x=new int[n];
bestx=new int[n];
for (i=0;i<n; i++)
{
w[i]=wd[i];
p[i]=pd[i];
}
Backtrack(0);
printf("bestp=%d\n",bestp);
for (i=0;i<n; i++)
printf("%d ",bestx[i]);
printf("\n");
return 0;
}