题目意思就是给定这么多木棒,要几个几个组合成等长的几段,问组和成的长度最短是多少。
先是要剪枝;
1.首先,组合成的长度,最少是这些木棍中最长的那一条,最长是木棍长的和。
2 .然后如果长度不能被总长整除就不行。
3. 每次都要选;
4。然后如果已经有一个已经组成了这个长度,而剩下的不能组成,说明也不行
AC 代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100;
int stick[N];
int num;
int sum;
int mlong;
int vis[N];
void init() {
for (int i = 0 ; i < N ; i++) {
vis[i] = 0;
}
}
int cmp (int a, int b) {
return a > b;
}
bool dfs (int cur , int aim ,int left ,int k) {
if (cur == aim)
return true;
for (int i = k; i < num ; i++) {
if (!vis[i] && stick[i] < left) {
vis[i] = 1;
if (dfs(cur , aim , left - stick[i] , i + 1))
return true;
vis[i] = 0;
if (left == sum / (aim + 1)) // 第