想拍桌子,求调
查看原帖
想拍桌子,求调
823949
Hhy882577楼主2024/3/22 19:19

全部输出0


#include<bits/stdc++.h>
#define N 11
using namespace std;
int dp[N][1<<N][105],n,k,sum[1<<N],table[1<<N];		//dp[i][j][k]表示前i列的摆放情况(用二进制j来表示),且摆了k个国王的情况下,有几种摆放方案
void load(){
	int ans;
	for(int i=1;i<=(1<<n);i++){
		if(i&(i<<1))
			continue;
		ans=0;
		for(int j=1;j<=n;j++){
			if(i&(1<<j))
				ans++;
			table[i]=1;
			sum[i]=k;
		}
	}
}
int main(){
	cin>>n>>k;
	load();
	for(int i=1;i<=(1<<n);i++)
		dp[1][i][sum[i]]=1;
	for(int i=2;i<=n;i++){		//line
		for(int j=1;j<=(1<<n);j++){		//situations
			for(int s=0;s<=k;s++){		//king's quantity
				if(s>=sum[j]){
					for(int pre=1;pre<=(1<<n);pre++){     //last line's situations
						if(table[j]==1&&((j&pre)==0)&&table[pre]==1&&((j<<1)&pre)==0&&((pre<<1)&j)==0){
							dp[i][j][s]+=dp[i-1][pre][s-sum[j]];
						}	
						//cout<<dp[i][j][s];
					}
				}
				//cout<<'\n';
			}
			//cout<<table[j]<<" ";
		}
	}
	int ans=0;
	for(int i=1;i<=(1<<n);i++)
		ans=max(ans,dp[n][i][k]);
	cout<<ans;
	return 0;
}
2024/3/22 19:19
加载中...