记忆化求调
查看原帖
记忆化求调
242524
JRzyh楼主2022/8/20 21:36
#include<bits/stdc++.h>
//#include<windows.h>
using namespace std;
int dp[1<<21],n,k,f[21][21];
int diw(int val,int pos)
{
	return (1<<(pos-1))&val;
}
int dfs(int val)
{

	if(dp[val]!=1e9)return dp[val];
	if(__builtin_popcount(val)<=k)return dp[val]=0;
	int x=1e9;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(diw(val,i)==0)continue;
			if(i==j)continue;
			if(diw(val,j)==0)continue;
			x=min(x,dfs(val^(1<<(i-1)))+f[i][j]);
		}
	}
	return dp[val]=x;
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>f[i][j];
		}
	}
	for(int i=0;i<(1<<21);i++)
	{
		dp[i]=1e9;
	}
	
	dfs((1<<n)-1);

	int ans=1e9;
	for(int i=0;i<=(1<<n)-1;i++)
	{
		if(__builtin_popcount(i)<=k)ans=min(ans,dp[i]);
	}
	cout<<ans<<endl;
    return 0;
}

2022/8/20 21:36
加载中...