开始被一个不知到是什么鬼的小地方弄得TLE了,也是很难受
之前是这么写的
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
const int maxn = 65+10, inf = 0x3f3f3f3f;
int s[maxn], m[maxn], Max = - inf, Min = inf, sum;
bool isget, yinzi[maxn*maxn];
vector<int> s_;
bool cmp ( int a, int b ) { return a < b; }
void dfs( int exlength, int last, int cur, int pos ) {
//printf("%d %d %d %d\n", exlength, last, cur, pos);
if( last == 0 ) {
printf("%d\n", exlength);
exit(0);
}
if( cur == exlength ) {
dfs( exlength, last-1, 0, 0 );
return;
}
for( int j = pos; j <= s_.size(); j++ ) {
int i = s_[j];
if( !s[i] ) continue;
if( i + cur > exlength ) break; //
s[i]--; //使用这根棍子
dfs( exlength, last, cur+i, j );
s[i]++;
if( cur == 0 || cur + i == exlength ) return;
}
}
int main() {
int n, temp;
scanf("%d", &n);
while(n--) {
scanf("%d", &temp);
if( temp > 50 ) continue;
s_.push_back(temp);
s[temp]++;
m[temp]++;
sum += temp;
Max = Max < temp ? temp : Max;
Min = Min > temp ? temp : Min;
}
sort(s_.begin(), s_.end(), cmp);
for( int i = Max; ; i++ ) {
if( sum % i ) continue;
bool go = false;
dfs( i, sum / i - 1, 0, 0 );
}
return 0;
}
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdio>
#include <ctime>
using namespace std;
const int maxn = 65+10, inf = 0x3f3f3f3f;
int s[maxn], m[maxn], Max = - inf, Min = inf, sum;
clock_t b;
void dfs( int exlength, int last, int cur, int pos ) {
//printf("%d %d %d %d\n", exlength, last, cur, pos);
if( last == 0 ) {
printf("%d\n", exlength);
//printf("cost: %dms\n", clock()-b);
exit(0);
}
if( cur == exlength ) {
dfs( exlength, last-1, 0, Max );
return;
}
for( int i = pos; i >= Min; i-- ) {
if( s[i] && i + cur <= exlength ) {
s[i]--; //使用这根棍子
dfs( exlength, last, cur+i, i );
s[i]++;
if( cur == 0 || cur + i == exlength ) return;
}
}
return;
}
int main() {
int n, temp;
scanf("%d", &n);
while(n--) {
scanf("%d", &temp);
if( temp > 50 ) continue;
s[temp]++;
m[temp]++;
sum += temp;
Max = Max < temp ? temp : Max;
Min = Min > temp ? temp : Min;
}
b = clock();
for( int i = Max; ; i++ ) {
if( sum % i ) continue;
dfs( i, sum / i - 1, 0, Max );
}
return 0;
}