【USACO3-2-2】阶乘问题 dfs

原题

我们预处理一个数组dp[i][j]表明在i位二进制数里有j个1的二进制个数

然后,for i in [0, n],求出s=sum(F[i, 0~L])。如果这个和大于t,就说明我们要求的这个数字包含在num[k]=1里。把t扣除掉num[i]=0的情况,也就是扣掉s。


//usaco3-2-2 01串
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long

ll dp[1010][1010];
int n,l;
ll t;
int num[51];

void dfs(int n,int l,ll t)
{
    if (!t) return;
    ll cur,s=0;
    for (int i=0;i<=n;i++)
    {
        cur=s;s=0;
        for (int j=0;j<=l;j++) s+=dp[i][j];
        if (s>=t) 
        {
            num[i]=1;
            dfs(n-1,l-1,t-cur);
            break;
        }
    }
}

int main()
{
    scanf("%d%d%lld",&n,&l,&t);
    for (int i=0;i<=n;i++) dp[i][0]=1;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=l;j++)
            dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
    dfs(n,l,t);
    for (int i=n;i>=1;i--)
        if (num[i]) printf("1");else printf("0");
    printf("\n");
    return 0;
}




猜你喜欢

转载自blog.csdn.net/dadatu_zhao/article/details/80411644