考察: 思维+构造
错误思路:
以451为例.这道题不是从大到小枚举,再取余,存在取小的数更优的情况.dfs一定超时,完全背包不便记录路径.
思路:
我们的集合只包含0与1的数.如果要表示451的4一定需要4个100,5需要5个10.以此类推,由此n每位数字的最大值就是答案的最小长度.
然后考虑怎么构造答案.451 需要4个100,5个10,1个1. 我们需要长度尽量小就尽量加在一起. 111 110*3 10
参考了大佬的极简代码:
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int N = 11; 5 int nums[N],ans,n; 6 int main() 7 { 8 scanf("%d",&n); 9 for(int i=1;i<=n;i*=10) 10 { 11 int res = n/i%10; 12 ans = max(res,ans); 13 for(int j=1;j<=res;j++) nums[j] += i; 14 } 15 printf("%d\n",ans); 16 for(int i=ans;i;i--) printf("%d ",nums[i]); 17 if(ans) printf("\n"); 18 return 0; 19 }