9 条题解
-
41
留个赞再走
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; for(int i=1;i<=n-2;i++) //n-2是为了保障后面的最少有两个不含0的数。 { for(int j=i;j<=n-1;j++) //j直接从前一个数开始,避免重复。 { for(int k=j;k<=n;k++) { if((i+j+k)==n) { cout<<n<<'='<<i<<'+'<<j<<'+'<<k<<endl; //注意输出格式要求。 } } } } return 0; }
-
9
这题是典型的深度优先搜索。
深度优先搜索如果不知道没关系,走迷宫玩过吧, 深搜就像沿着一条路一直走,碰到死路就返回,最 后找到终点。
这题的思路是: 定义一个函数void dfs(int k)来深搜,k表示将n拆成3个数的其中哪一个数,可以理解成拆到的第几位数。 然后的一个if判断是否搜索完3位,并且总和为n,是就输出结果,不是就继续搜索。 接着循环用来相加的数(算符),照题目的要求,后面的数>=前面的数且不为0, 从1开始判断,如果>=前面的数就将此数存到数组中,接着dfs(k+1)搜索下一位。 dfs函数就完事了,由于要从第一位开始搜索,主函数中dfs(1),然后就无啦。
代码(已AC):
#include<iostream> using namespace std; int n,ans[10]={0}; void dfs(int k){ int sum=ans[1]+ans[2]+ans[3]; if(k>3){ if(sum==n){ cout<<n<<"="; cout<<ans[1]<<"+"<<ans[2]<<"+"<<ans[3]<<endl; return; } else return; } for(int i=1;i<=n;i++){ if(i>=ans[k-1]){ ans[k]=i; dfs(k+1); } } } int main(){ cin>>n; dfs(1); return 0; }
最后,给听不懂的同学送来其它方法,暴力の枚举法:
#include<iostream> using namespace std; int n; int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ for(int k=1;k<=n;k++){ if(i+j+k==n&&i<=j&&j<=k) cout<<i<<"+"<<j<<"+"<<k<<"="<<n<<endl; } } } return 0; }
听不懂是正常的,初学算法肯定会有点懵,但是不排除是我个人没讲好,有错误或讲解不到位望大佬指出,感谢看完我的题解。 看完求留下一个赞
-
-16
**using** **namespace** **std**; **int** **main**() { ** **int** **a**;** ** **cin**>>**a**;** ** **for**(**int** **i**=**1**;**i**<**a**;**i**+=**1**)** ** **{ ** **for**(**int** **j**=**i**;**j**<=**a**;**j**+=**1**)** ** **{ ** **if**(**a**-(**i**+**j**)>=**i** **and** **a**-(**i**+**j**)>=**j**)** ** **cout**<<**a**<<**"="**<<**i**<<**"+"**<<**j**<<**"+"**<<**a**-(**i**+**j**)<<**"**\\n**"**;** ** **else ** **continue**;** ** **} ** **} ** **return** **0**;** }
- 1
信息
- ID
- 513
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 1115
- 已通过
- 574
- 上传者