深搜,剪枝
这组数据用的时间应该超过一秒了,可提交还是AC了。
数据:
64
40 40 30 35 35 26 15 40 40 40 40 40 40 40 40 40 40 40 40 40 40
40 40 43 42 42 41 10 4 40 40 40 40 40 40 40 40 40 40 40 40 40
40 25 39 46 40 10 4 40 40 37 18 17 16 15 40 40 40 40 40 40 40
40
#include <iostream>
using namespace std;
int n,a[64],mark[64],totalLen,sLen;
void kSort(int low,int high)
{
int pivotkey = a[low],i = low, j=high;
while(i < j){
while(i<j && a[j] <= pivotkey)
j--;
a[i] = a[j];
while(i<j && a[i] >= pivotkey)
i++;
a[j] = a[i];
}
a[i] = pivotkey;
if(low < high){
kSort(low,i-1);
kSort(i+1,high);
}
}
bool dfs(int temp, int k, int num)
{
if(num == totalLen/sLen) return true;
else if(temp == sLen)
dfs(0,0,num+1);
else{
int i,pre=0;// ?????
for(i=k; i<n; i++)
if(mark[i]==0 && a[i] != pre && a[i] + temp <= sLen){
mark[i] = 1;
pre = a[i];
if(dfs(temp+a[i],i+1,num))
break;
mark[i] = 0;
if(k==0)
return false;
}
// cout << pre << endl;
if(i==n)
return false;
else
return true;
}
}
int main()
{
int i;
scanf("%d",&n);
while(n){
totalLen = 0;
memset(a,0,sizeof(a));
memset(mark,0,sizeof(mark)); // mark 大小
for(i=0; i<n; i++){
scanf("%d",&a[i]);
totalLen += a[i];
}
kSort(0,n-1);
sLen = a[0];
while(sLen <= totalLen){
while(totalLen % sLen)
sLen++;
if(dfs(0,0,0)){
printf("%d/n",sLen);
break;
}
memset(mark,0,sizeof(mark));
sLen++;
}
scanf("%d",&n);
}
return 0;
}