【问题描述】
蓝桥学院由21栋教学楼组成,教学楼编号1到21。对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。
小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?两个访问方案不同是指存在某个i,小蓝在两个访问方法中访问完教学楼i后访问了不同的教学楼。
提示:建议使用计算机编程解决问题。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
解析:
总结:
互质数: 公因数只有1的两个自然数,叫做互质数
可以通过判断两个数的最大公因数是不是1来确认
public static int gcd(int a,int b){return b==0?a:gcd(b,a%b);
}
dp[1][0]=1;
public class ExaminationE_dpVersion3 {public static final int n = 21;//判断是否互质public static int gcd(int a,int b){return b==0?a:gcd(b,a%b);}public static long[][] allPath(long[][] dp,long[][] path){for (int i = 0; i < (1 << n); i++) {for (int j = 0; j < n; j++) {if (((i>>j)&1)==1) {for (int k = 0; k < n; k++) {if (path[j][k]==1&&(((i-(1<>k)&1)==1) {dp[i][j] += dp[i-(1<long[][] path = new long[n][n];long[][] dp = new long[1 << n][n];for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) {if (gcd(i+1,j+1)==1) {path[i][j] = path[j][i] = 1;}}}//初始化dp[1][0] = 1;long[][] result = allPath(dp,path);long res = 0;for (int i = 1; i < n; i++) {res+=result[(1<
[1]第12届蓝桥杯省赛A组C++回路计数(统计哈密尔顿回路个数,状压dp,记忆化搜索,超详解)-非常耗时,还没输出结果
[2]耗时7701毫秒且输出正确–为什么数组都从0开始存储
[3]答案错误,思路可参考
[4]分析很详细
[4]如何判断两个数是否互质
[5]《算法》第一章——判断两个整数是否互质