我前几天写了一篇csdn博客文章:【算法设计与分析】——整数划分问题,使用的是递归方法,今天准备使用回溯法啦啦啦啦啦~
上一篇链接:算法设计与分析——整数划分问题(递归法)
首先我给大家画了一个流程图:
其次我给大家录了一个视频讲解:
因为csdn博客中上传的视频目前仅支持腾讯优酷bilibili,所以我上传到资源啦,但是免费哦~
视频讲解链接:整数划分问题(回溯法)视频讲解
代码实现
大家如果还是看不懂代码,可以自己选取一个简单的例子在草稿纸上演示一遍哦~
#include<stdio.h>
int nums[100]; //nums用来存放需要放入的数据
int count = 0; //count用来记录一共有多少种划分方法
int integerDivide(int cur,int sum,int p,int n){
//cur表示当前使用的数组位置 sum表示当前使用位置中所存放的数据之和 p表示当前要划分的数 n表示需要划分的数
if(sum > n) return;
if(sum == n){
count++;
printf("%d=",n);
for (int i = 0; i < cur; i++) { //用来控制输出
if (i==cur-1)
printf("%d",nums[i]);
else printf("%d+",nums[i]);
}
printf("\n");
return;
}
for (int i=p;i>0;i--){ //回溯法
nums[cur] = i;
integerDivide(cur+1,sum+i,i,n);
}
return count;
}
int main(){
int n,s;
printf("请输入你想要划分的正整数n:\n");
scanf("%d",&n);
s=integerDivide(0,0,n,n);
printf("该正整数%d一共有%d种划分方法!\n",n,s);
return 0;
}
结果示例
- 示例一
- 示例二
- 示例三