我想着是不是自己还有地方减枝出问题
不然应该不会有460ms超时吧
//小木棍,dfs搜索优化
// 优化点1:所有木棍长之和是选定木棍的长度的倍数,即sum%len==0
// 优化点2:在搜索过程中先使用能使用的最长的木棍,并且只选定当前长度的木棍一次(即去重)
// 优化点3:在搜索过程中,若恰好用到一根新的木棍(即刚好切完当前木棍),第一次搜索得不到结果回溯后直接退出
// 优化点4:在搜索过程中,若当前剩余木棍的长度之和不足以拼接成目标木棍的当前长度,直接返回
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int li[70], times[55], ind, sum, m, n;
void dfs(int llen, int len, int nums,int le) {
if (le < llen)return;//4
if (nums == 0) {
if (llen == 0) {
cout << len;
exit(0);
}
else return;
}
if (llen == 0)llen = len;
for (int i = ind; i > 0; i--) {
if (li[i] > llen || !times[li[i]])continue;
times[li[i]]--;
dfs(llen - li[i], len, nums - 1, le - li[i]);
times[li[i]]++;
if (llen == len || li[i] == llen)return;//3
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> li[i];
sum += li[i];
times[li[i]]++;//2
m = max(li[i], m);
}
sort(li + 1, li + 1 + n);//2
ind = unique(li + 1, li + 1 + n) - li;//2
for (int i = m; i <= sum; i++) {
if (sum % i == 0) {//1
dfs(i, i, n, sum);
}
}
}
我个人自己还能想到的几个优化地方
输入函输出换成scanf,print
使用二分法查找最大的可使用木棍
主函数中排序写成桶排序或者计数排序
不用unique去重,自己写数组记录去重
但是我觉得这些可能优化不了多少时间
其他的实在是没思路了,求大佬看看,我的提交显示460ms是不是还差很多啊