UVA307

来源:互联网 发布:阿里旺旺网络连接失败 编辑:程序博客网 时间:2024/05/10 04:51

题目意思就是给定这么多木棒,要几个几个组合成等长的几段,问组和成的长度最短是多少。

先是要剪枝;

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))   // 第三个剪枝return false;} if (!vis[i] && stick[i] == left ) {vis[i] = 1;if (dfs(cur + 1 ,aim , sum / (aim + 1) , 0))return true;vis[i] = 0;return false;  // 第四个剪枝 }}return false;}int main () {while (cin >> num && num) {sum = 0;init();for (int i = 0 ; i < num ; i++) {cin >> stick[i];sum += stick[i];}sort(stick , stick + num ,cmp);mlong = stick[0];for (int i = mlong ; i <= sum ;i++) {    //第一个剪枝if (sum % i != 0)    //第二个剪枝continue;if (dfs(0 , sum / i - 1 , i , 0)) {cout << i <<endl; break;}}}}




1 0
原创粉丝点击