1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int Maxn=110; int n,cnt;//n储存需要到达的数,cnt储存最优解长度 int a[Maxn],ans[Maxn]; void dfs(int x)//搜索序列第x个 { if(a[x-1]>=n)//如果当前最大项大于或等于需要到达的数 { if(a[x-1]==n && x-1<cnt)//如果等于且项数小于最优解 { cnt=x-1;//更新最优解 for(int i=1;i<=cnt;i++) { ans[i]=a[i];//更新答案 } } return ; } for (int i=x-1;i>=1;i--)//从当前最大项向前搜索相加 { if(a[x-1]+a[i]<=n&& x-1<cnt)//剪枝策略 { a[x]=a[x-1]+a[i];//当前的数更新 dfs(x+1);//再搜索下一个数字 a[x]=0;//可不加,调试用 } } } int main() { while(cin>>n&&n) { memset (a,0,sizeof(a)); a[1]=1;cnt=0x3f3f3f3f; dfs(2);//搜索第二个数 for(int i=1;i<=cnt;i++) { cout<<ans[i]<<" "; } cout<<endl; } return 0; }
课后总结
- 1
信息
- ID
- 492
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 60
- 已通过
- 23
- 上传者