递归问题,不懂如何输出一个集合全部的子集

include<stdio.h>

void Snapsack(int i,int m[],int n);
int main()
{

int m[4]={0};
Snapsack(4,m,4);
return 0;

}

void Snapsack(int i,int m[],int n)
{

if(!i)
{ 
    for(int j=0;j<n;j++)        
        printf("%d",m[j]);
    printf("\n");    
} 
else
{
            //这段代码为什么可以得出所有可能性;不大理解这种递归;
    m[i]=1;
    Snapsack(i-1,m,n);
    m[i]=0;
    Snapsack(i-1,m,n);
}

}

阅读 2.3k
1 个回答

你是在问什么...是问的背包问题吗...

更新:
因为你的snapsack函数在i的时候会去令i位的m等于0或者等于1.
然后去算i-1的时候的snapsack()。
最后到了base case(也就是i==0的时候),打印出整个m数组。
因为你用m表示的话,m等于0或者1.
因此这个递归可以得出所有结果。

PS:

  1. 你这个不是背包问题,只是恰好问题里出现了背包=。 =
  2. knapsack 不是snapsack。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进