题目大意:取一些长度相同的木棍,将他们切割成随意长度的小木棍,现在要将他们拼回原状,问每根原始木棍的长度最小值
输入:(输入以0结束)
切割后的木棍个数(最多64个)
每个棍的长度(中间用空格分隔)
输出:木棍的原长度最小值
分析:dfs+剪枝
大致思路:最长的小木棍max,和所有小木棍长度的总和sum,那么原木棍长度一定在max~sum之间,从max开始枚举能被sum整除的原木棍长度len,再dfs(枚举从某个小木棍开始,能不能拼凑成len长)求出所有小木棍能否拼凑出这个长度
各种剪枝:1.所有小木棍按长度从大到小排序(越长的小木棍对后面小木棍的约束就越大,按降序排列可能会在最靠近根的地方剪枝)
2.跳过重复长度的小木棍(比如当前木棍与小木棍A组合dfs发现不能凑成len,后面所有跟A长度相同的小木棍就不用再组合了)
3.如果当前最长小木棍都不能凑成len,则返回上一步,更改上一步的组合情况
代码:转载自http://blog.sina.com.cn/s/blog_6635898a0100lgq0.html
#include<iostream>
#include<algorithm>
using namespace std;
const int Max = 65;
int n, len, stick[Max];
bool flag, vis[Max];
bool cmp(int a, int b){
}
void dfs(int dep, int now_len, int u){
}
int main(){
}