NC50244. Addition Chains
描述
输入描述
第一行为一个单独的整数N表示砍过以后的小木棍的总数。第二行为N个用空格隔开的正整数,表示N根小木棍的长度。
输出描述
输出仅一行,表示要求的原始木棍的最小可能长度。
示例1
输入:
5 7 12 15 77 0
输出:
1 2 4 5 1 2 4 6 7 1 2 4 8 12 1 2 4 5 10 15 1 2 4 8 9 17 34 68 77
C++11(clang++ 3.9) 解法, 执行用时: 912ms, 内存消耗: 400K, 提交时间: 2020-02-26 12:24:36
#include<cstdio> #include<cstring> using namespace std; int a[105],bo[105],ans[105]; int n,m; bool check(int v,int x) { for (int i=0; i<=x; ++i) if (v-a[i]>=0 && bo[v-a[i]]) return 1; return 0; } void dfs(int x) { if (x>=m) return; if (a[x]==n) { if (x<m) m=x,memcpy(ans,a,sizeof(ans)); return; } for (int j=n; j>a[x]; --j) if (check(j,x)){ a[x+1]=j; bo[j]=1; dfs(x+1); bo[j]=0; } return; } int main() { bo[1]=1; a[0]=1; while (scanf("%d",&n),n){ for (int i=2; i<=n; ++i) bo[i]=0; m=1e5; dfs(0); for (int i=0; i<=m; ++i) printf("%d ",ans[i]); printf("\n"); } }