一个比较简单的全排列,用一维数组a[i]=a[i]+a[i+1],每次更新直到加到最后一次,第一个数就是总和,两种方法,一个是dfs,一个是全排列函数
dfs
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int vis[15],num[15],a[15];
int sum,n,flag=0;
void judge()
{
int k=n;
/*
for(int i=0;i<n;i++)
a[i]=num[i];
*/
memcpy(a,num,sizeof(num));
while(k--)
{
for(int i=0;i<k;i++)
a[i]+=a[i+1];
}
//cout<<a[0]<<endl;
if(a[0]==sum)
{
flag=1;//第一个就是字典序最小的,找到之后其他的就不用找
for(int i=0;i<n-1;i++)
cout<<num[i]<<" ";
cout<<num[n-1]<<endl;
}
return;
}
void dfs(int deep)
{
if(flag)//已经有了答案,直接退出
return;
if(deep==n)
{
judge();
return;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
num[deep]=i;
vis[i]=1;
dfs(deep+1);
vis[i]=0;
}
}
return;
}
int main()
{
cin>>n>>sum;
dfs(0);
return 0;
}
next_premutation全排列
倒不如说dfs就是模仿全排列来写这题的
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int n,sum;
int a[15],num[15];
cin>>n>>sum;
for(int i=0;i<n;i++)
num[i]=i+1;//初始数组
while(next_permutation(num,num+n))
{
memcpy(a,num,sizeof(num));
int k=n;
while(k--)
{
for(int i=0;i<k;i++)
a[i]+=a[i+1];
}
if(a[0]==sum)
break;
}
for(int i=0;i<n-1;i++)
cout<<num[i]<<" ";
cout<<num[n-1]<<endl;
return 0;
}
本文介绍了一种使用全排列算法解决特定求和问题的方法,通过深度优先搜索(DFS)和next_permutation函数实现,旨在寻找满足条件的最小字典序数组合。

471

被折叠的 条评论
为什么被折叠?



