解释一下代码,看了半天不太懂

代码看不懂,有没有人解释一二
题目:长度为N的01串有2的N次方个,求从小到大数第I个去掉“1”的个数大于L的01串

#include <bits/stdc++.h>
int dp[33][33];
int DP(int N,int L)
{
    if(N==0||L==0)
        return 1;
    if(dp[N][L]!=0)
        return dp[N][L];
    dp[N][L]=DP(N-1,L)+DP(N-1,L-1); 
    return dp[N][L];
}
 
int main()
{
    int N,L;
    long long I;
    int i,j,num=0;
    int t=0;
    cin>>N>>L>>I
    I-=1;
    for(t=N; t>0; t--){
        if(I&&DP(t-1,L)<=I){
            printf("1");
            I-=DP(t-1,L);
            L-=1;
        }
        else
            printf("0");
    }
    return 0;
}


#include <bits/stdc++.h> 
//包含所需头文件
int dp[33][33]; 
//定义dp二维数组,用于储存组合数,dp[i][j]表示i个元素中取j个元素的组合数
int DP(int N,int L) 
//DP函数用于计算组合数,N表示总元素数,L表示取出的元素数
{
    if(N==0||L==0) 
        return 1; 
    //基准条件,当N或L为0时,组合数为1
    if(dp[N][L]!=0) 
        return dp[N][L]; 
    //如果组合数已经计算过,直接返回
    dp[N][L]=DP(N-1,L)+DP(N-1,L-1); 
    //计算组合数公式,dp[N][L]=dp[N-1][L]+dp[N-1][L-1]
    return dp[N][L];
}
int main() 
{
    int N,L; 
    //输入总元素数N和取出元素数L
    long long I; 
     //输入整数I
    int i,j,num=0; 
    int t=0; 
    cin>>N>>L>>I 
    I-=1;  //I减1,作为下标使用
    for(t=N; t>0; t--){ 
        //从N开始倒序遍历
        if(I&&DP(t-1,L)<=I){ 
            //如果I大于dp[t-1][L],输出1,并减去dp[t-1][L]
            printf("1");
            I-=DP(t-1,L);
            L-=1; 
        } 
        else 
            printf("0"); 
    }
    return 0;
}
//这是一道组合数的题目,通过DP函数递归计算组合数,并根据输入I输出相应的组合。
//在解释或实现代码过程中有任何不理解或错误的地方,请指出,我会认真学习和改进。
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/379113
  • 这篇博客你也可以参考下:给个n,求1到n的所有数的约数个数的和~
  • 除此之外, 这篇博客: 任意一个大于2的偶数都可以分解为两个质数之和 给定一个大于2的偶数n,求解这两个质数.中的 输入一个数n,判断其是否为大于二的偶数,一层循环从2开始,直到这个偶数的一半,每次判断n与n-i是否均为偶数,是则输出,否则继续循环,直到循环结束。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    代码

    #include<stdio.h>
    int issushu(int x)//判断是否为素数
    {
    	int i;
    	for(i=2;i<=x/2;i++)
    	{
    		if(x%i==0)
    		{
    			return 0;	
    		}
    	}
    	return 1;
    }
    int main()
    {
    	int n;
    	int i;
    	int a = 0;
    	printf("请输入一个大于二的偶数:");
    	scanf("%d",&n);
    	if(n<=2 || n%2!=0 )
    	{	
    		printf("别闹!输入一个大于二的偶数!");
    		return 0;	
    	}
    	for(i=2;i<=n/2;i++)
    	{
    		a = n-i;
    		if(issushu(i) && issushu(a))
    		{
    			printf("%d=%d+%d\n",n,i,a);
    		}
    	}
    	return 0;
    }
    
    

    刚开始学,写的不好,轻喷;


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^