输入m和n,打印所有的n位数,其各位之和为m。要求使用回溯算法,C++语言。刚入门,希望代码简单易懂。
void fun(int m, int n, int sum, int start) {//m:目标和 n:个数的集合 sum:搜集的元素总和 start:下一层for循环搜集的起始位置
if (sum > m) {
return;
}
if (path == n) {
if (sum == m)
return;
}
for (int i = start; i <= m; i++) {
sum += i;
fun(m, n, sum, i + 1);
sum -= i;
}
}
int main()
{
int m, n;
cout << "请输入m,n:"<<endl;
cin >> m >> n;
fun(m, n, 0, 1);
cout << path << " ";
}
大概要这种格式的,网上的太复杂看不懂
vector<vector<int>> res;
//对一个vector中的数求和
int getSum(vector<int> cur) {
int sum = 0;
for (int x : cur)sum += x;
return sum;
}
//dfs回溯
void getN(int m, int n,vector<int> cur) {
//当前的数组元素数量到达n了之后检查合是否为m并且要第一位不为0,是就添加到答案数组中去,不是就不管,然后停止当前的递归
if (cur.size() == n) {
if (getSum(cur) == m&&cur[0]!=0) res.push_back(cur);
return;
}
for (int i = 0; i <= 9; i++) {
cur.push_back(i);
getN(m, n, cur);
cur.pop_back();
}
}
int main()
{
int m = 3, n = 4;
vector<int> cur;
getN(m, n, cur);
vector<string> ans;
for (vector<int> arr : res) {
string s;
for (int x : arr) s += to_string(x);
ans.push_back(s);
}
}
你自己把m,n改为输入就行,我这里为了方便给你看一下测试数据。然后我都获得了结果数,你打印出来就行了。
回溯算法可以理解为穷举法,手写了一段代码,本来用c写的,最后才看到你说要用c++简单的改了一下,也不用markdown,你直接复制下来运行就可以了,你看看吧
#include "iostream"
#include<malloc.h>
using namespace std;
int mypow(int x,int y)
{
int value = 1;
int i = 0;
if(y == 0)
{
return value;
}
if(x == 0)
{
return 0;
}
while(i < y)
{
value = value * x;
if(value >= INT_MAX)
{
cout<<"out of int max range!\n";
return NULL;
}
i++;
}
return value;
}
int* printNumbers(int n, int* returnSize){
int end = 0;
int start = 0;
int *arr;
start=mypow(10,n-1)-1;
end = mypow(10,n);
*returnSize = end -start;
arr = (int )malloc(sizeof(int)(*returnSize));
if(arr == NULL)
{
return NULL;
}
for(int i=0; i < *returnSize; i++)
{
arr[i] = start;
start++;
}
return arr;
}
int main(void)
{
int maxnum=0;
int m,n;
cout <<"input m n"<<endl;
cin>>m>>n;
//cout <<m<<"-------"<<n<<endl;
int *p=printNumbers(n,&maxnum);
cout << "满足要求的数字有:"<<endl;
for(int k=0;k<maxnum;k++)
{
int value=*p;
int sum=0;
while(value>0){ //使用循环进行位数与和的叠加
sum+=value%10; //对a取余10进行数位和的叠加
value/=10; //重点:以确保能进行下一位数的叠加,必须不断的/10
}
if(sum==m)
{
cout<<*p<<endl;
}
p++;
//cout << *p<<endl;
}
}