再次求调
查看原帖
再次求调
873417
Istruggle楼主2023/12/30 10:38

为什么一直输出0?

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,cnt=0;
int num[1<<11],s[1<<11],dp[11][1<<11][105];
signed main(){
	memset(num,0,sizeof(num));
	memset(s,0,sizeof(s)); 
    scanf("%lld%lld",&n,&k);
    for(int i = 0;i<=(1<<n);i++){
        if(!(i&i>>1)) s[++cnt]=i;   //s存放合法状态 
        int x=i;
        while(x){
            if(x&1) num[i]++;    //num[i] 表示 i 在二进制下 1 的个数 
            x=x>>1;
        }
    }
    for(int i = 1;i<=cnt;i++)
    dp[1][i][num[i]]=1;
    for(int i = 2;i<=n;i++){
        for(int a=1;a<=cnt;a++){  //枚举第 i 行的状态 
            for(int b =1;b<=cnt;b++){ //第 i-1 行的状态 
                if(!(s[a]&(s[b]|(s[b]>>1)|(s[b]<<1)))){
                    for(int j = num[a];j<=k;j++)
                    dp[i][a][j]+=dp[i-1][b][j-num[a]];
                }  
            }
        }
    }
    int ans=0;
    for(int i = 1;i<=cnt;i++)
    ans+=dp[n][i][k];
    printf("%lld",ans);
    return 0;
}
2023/12/30 10:38
加载中...