首先上题
看到这个输出我们第一眼就可以想到深搜,虽然我第一眼看到数据范围就想打表。
接下来就要思考深搜如何实现了
首先考虑深搜的参数,第一应该定义一个qd作为加数的起点。
第二定义一个数sum来记录目前搜到的数的总和与n比较作为回溯条件。
第三定义一个数cts来记录搜到的每个数的值便于输出,此处应有一数组a与其配合;
于是我们便完成了dfs参数的定义。
那么就不难实现搜索功能了。贴上代码
void dfs(int qd, int sum, int cts)
{
if ( qd == n ) return;//起点与n相同,不写此句则会输出n本身;
if ( sum == n )//和达到所求n的值,输出即可。
{
cout << a[0];
for ( int i = 1; i <= cts-1; i++ )
{
cout << '+' << a[i];
}
cout << '\n';
}
for ( int i = qd; i <= n-sum; i++ ) {a[cts]=i;dfs(i,sum+i,cts+1);}//搜索
}
ac代码
#include<bits/stdc++.h>
using namespace std;
int n, a[15];
void dfs(int qd, int sum, int cts)
{
if ( qd == n ) return;//起点与n相同,不写此句则会输出n本身;
if ( sum == n )//和达到所求n的值,输出即可。
{
cout << a[0];
for ( int i = 1; i <= cts-1; i++ )
{
cout << '+' << a[i];
}
cout << '\n';
}
for ( int i = qd; i <= n-sum; i++ ) {a[cts]=i;dfs(i,sum+i,cts+1);}//搜索
}
int main()
{
cin >> n;
dfs(1,0,0);//sum,cts初值为0,起点从1开始加
return 0;
}