废话不多说直接上代码
int n = 5;//物品数量
int V = 8;//背包最大重量
int w[100] = {3,5,1,2,2};//重量
int c[100] = {4,5,2,1,3};//价值
int tabTemp[10] = { 0 };//深度搜索过程中选择方案
int tab[10][10] = { 0 };//将当前方案保存,以便后面查看
int bingo = 0;//方案列表的索引
int maxValue = 0;//最大价值总和
void DFS(int index, int sumW, int sumC)
{
if (index == n)
{
if (sumC >= maxValue)
{
//这一部分就是当有了更大的价值总和时,将方案列表的索引置0,覆盖之前价值总和最大时的方案,当sumC==maxValue时,意味着此时价值总和最大有第二套方案,bingo++
if (sumC > maxValue)
bingo = 0;
else
{
bingo++;
}
//替换最大价值总和
maxValue = sumC;
//保存此时的选择方案
for (int i = 0; i < n; i++)
{
tab[bingo][i] = tabTemp[i];
}
}
return;
}
tabTemp[index] = 0;
DFS(index + 1, sumW, sumC);
//剪枝,当选中当前物品时总重量不超过容积时才进入递归
if (sumW + w[index]<=V) {
tabTemp[index] = 1;
DFS(index + 1, sumW + w[index], sumC + c[index]);
}
}
int main()
{
DFS(0, 0, 0);
printf("%d\n", maxValue);
for (int count = 0; count <= bingo; count++)
{
for (int i = 0; i < n; i++)
printf("%d ", tab[count][i]);
printf("\n");
}
return 0;
}
10
0 1 1 0 1
1 0 1 1 1
最大价值10,一共两种方案,
方案1:选第2,3,5个物品
方案2:选第1,3,4,5个物品