输出全排列(回溯法,C语言)

因为比较菜,网上很多都是画树来做的,我现在还没学到(可能以后一个月之后?会学到) ,所以出了一个简单的ans和思路;

符号说明:

step:元素在数组的位序(1<=step<=n)

flag[x]:数字x是否被占用(我一开始没想到是这个意思,还以为x是位序

a[step]:输出的答案数组

回溯法:

找到递归后面的终止条件,简单的情况就是越界(step>n)

然后如果没有越界,那么就往数组里面填数字,从1开始填

然后注意对数字使用状态做标记(flag

先给数组赋值,再改变其状态;

利用递归函数,让整个选择可能性纵向展开

直到for循环结束,就可以回溯了;其中return在这里是指回溯的意思

其他的都写在注释里面了;

最后别忘记对所有的a[]和flag[]进行初始化;

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

int flag[11] = { 0 };//占位标记
int a[] = { 0 };

void PrintArray(int *a, int n) {
	int i = 0;
	for (i = 1; i<=n; i++) {
		printf("%d", a[i]);
	}
	printf("\n");
}

void go(int step,int n) {
	if (step > n) {
		PrintArray(a,n);
		return;
	}
	else {
		for (int x = 1; x <= n; x++) {
			if (flag[x] == 0) {//flag表示这个数是否被占用了
				a[step] = x;
				flag[x] = 1;
				go(step + 1, n);
				flag[x] = 0;
				continue;
			}
			else {
				continue;
				//当x被占用,就直接跳出x的情况,从而for循环进入x+1;然而第一步,所有flag=0,必然会进入第一个if.从而会有函数的递归调用
			}
		}
		return;
	}
}

int main() {
	int n;
	int i = 1;
	scanf("%d", &n);
	go(i,n);
	return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用回溯法解决01背包问题的C语言代码示例: ```c #include <stdio.h> #define MAX_N 100 // 最大物品数量 #define MAX_WEIGHT 1000 // 背包的最大承重 int weight[MAX_N]; // 物品的重量数组 int value[MAX_N]; // 物品的价值数组 int max_value; // 最大总价值 int best_choice[MAX_N]; // 最佳选择情况数组 int current_weight; // 当前背包内物品的总重量 int current_value; // 当前背包内物品的总价值 void backtrack(int n, int index) { if (index == n) { // 已经遍历完所有物品 if (current_value > max_value) { // 更新最大总价值和最佳选择情况 max_value = current_value; for (int i = 0; i < n; i++) { best_choice[i] = (current_weight >> i) & 1; // 1表示选择该物品,0表示不选择 } } return; } if (current_weight + weight[index] <= MAX_WEIGHT) { // 选择当前物品 current_weight += weight[index]; current_value += value[index]; backtrack(n, index + 1); current_weight -= weight[index]; current_value -= value[index]; } backtrack(n, index + 1); // 不选择当前物品 } int main() { int n; // 物品数量 printf("请输入物品数量:"); scanf("%d", &n); printf("请依次输入每个物品的重量和价值:\n"); for (int i = 0; i < n; i++) { scanf("%d %d", &weight[i], &value[i]); } max_value = 0; current_weight = 0; current_value = 0; backtrack(n, 0); printf("最大总价值为:%d\n", max_value); printf("最佳选择情况为:"); for (int i = 0; i < n; i++) { printf("%d ", best_choice[i]); } printf("\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值