思路:
DFS:
首先,将这些树枝从小到大排序,然后从最大的树枝开始搜索,到这些树枝长度总和为止,只要dfs到满足条件的最小拼凑长度就break掉。
那么,在dfs里面,x参数表示从哪根树枝搜索,len表示当前的拼凑的树枝长度,hope表示期望拼凑的长度,size表示所用树枝的根数。每用一根树枝都会使size+1,终止条件为所用树枝根数和总根数相等,那么表示可以满足题意。
在dfs循环内部,从前往后,如果该树枝没被用过且当前长度+该树枝长度小于等于期望长度那么进行判断,将该树枝标记为用过,分情况讨论继续往下dfs:如果刚好等于要拼凑的长度hope那么继续往下深搜,初始化参数,根数+1;否则在这个条件之上进行dfs,然后回溯。
循环下面的剪枝(这题需要剪枝优化):
1.len==0 return ;表示最开始的时候第一根树枝根本就用不了,那么这个dfs就不用进行下去了(因为你下面无论怎么dfs,这根树枝总是组成不了你想要的那个数值,所以所用树枝根数恒不等于总根数,往下没必要)。
2.while(i<n&&a[i+1]==a[i])i++; 因为if语句判断到最后是没有满足等于期望长度这个条件的,所