一个体积为V的背包,现在有体积分别为(w1, w2, w3, w4, w5, w6......)i个物体,如何从中选取若干个物体放满背包:
以下是我的代码,主要采用了回朔的思想。
#include <stdio.h>
void baibao(int a[], int n, int v)
{
int sum=0;
int index[10]={0};
int q=0;
int j,i;
sum = a[0];
index[q++] = 0;
if(sum==v)
{
printf("%-3d\n",a[0]);
q--;
sum = 0;
}
else if(sum>v)
{
q--;
sum = 0;
}
for(j=1; j<n; j++)
{
sum+=a[j];
if(sum>v)
{
sum-=a[j];
}
else if(sum==v)
{
for(i=0; i<q; i++) printf("%-3d",a[index[i]]);
printf("%-3d\n",a[j]);
sum-=a[j];
}
else
{
index[q++] = j;
}
if(((j+1)==n||(j+1)==(n+1))&&q!=0)
{
if(index[0]==n-1)
{
break;
}
if(index[q-1] == n-1)
{
sum -= a[index[--q]];
sum -= a[index[--q]];
j = index[q];
}
else
{
sum -= a[index[--q]];
j=index[q];
}
}
}
}
int main(void)
{
int a[6] = {1,8,4,3,5,10};
baibao(a,6,10);
return 0;
}