POJ-1011

本文介绍了一种使用深度优先搜索(深搜)结合剪枝技术解决特定问题的算法实现。通过对输入数据进行快速排序,并利用深搜遍历所有可能组合来寻找符合条件的解,同时通过剪枝减少搜索空间,提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 深搜,剪枝

这组数据用的时间应该超过一秒了,可提交还是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;

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值