【先加后减拼凑思想】【合成数问题】
https://www.nowcoder.com/acm/contest/105/D
题目大意:【背景:我们可以把任意一个数x表示成若干不相同的Fibonacci数的和】给一个数X,分解成一组不相同斐波那契数,并且这些将这些下标表示为二进制串【即含有第I位的斐波那契数,则二进制串的I位为1】再化为十进制之后的数最小【语言描述能力好差。反正就是尽量找若干小的元素】。
题目分析:如果想要直接拼凑,那么就需要进行DFS进行暴搜合成数X,数据大时显然不行。而由于任意数都可以用不同的斐波那契数合成,并且易知下标为N之前的的斐波那契数能合成所有小于等于An的数,这也使先加后减拼凑数X变得可行,而且得到的也是尽可能小的元素。具体做法就是从A0开始加一直加到大于X,然后再慢慢往前减【如果减去之后结果不小于X就减,否则就不减】。好吧,我对这一题的理解还不是很到位【以后想通了再来填坑,或者不填了?】
虽然我对这道题的理解并不透彻,但还是学到了先加【加到超过X】后减【只要减去之后也不小于X就减】进行拼凑数X的思想。