日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA 307 Sticks

發布時間:2025/3/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA 307 Sticks 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UVA_307

相當于重溫了一下POJ 1011這個題目,剪枝在這個題目中顯得尤為重要。

對于這道題而言,剪枝的策略一般有下面6個:

①先將木棒長度從大到小進行排序,這樣便于后面的選擇和操作,是后面一些剪枝算法的前提。

②在枚舉原木棒長度時,枚舉的范圍為maxsum/2之間,如果這個區間內沒有找到合適的長度,那么最后原木棒的長度只能是sum

③枚舉的原木棒的長度只能是sum的約數。

④在深搜過程中,如果當前木棒和前一個木棒的長度是一樣的,但是前一個木棒沒有被選上,那么這個木棒也一定不會被選上。

⑤在深搜過程中,如果當前是在拼一根新木棒的第一截,但如果把可用的最長的一根木棒用上后不能拼成功的話,那么就不用再試后面的木棒了,肯定是前面拼的過程出了問題。

⑥在深搜過程中,如果當前可用的木棒恰好能補上一根原木棒的最后一截,但用它補上之后卻不能用剩下的木棒完成后續的任務,那么也不用再試后面的木棒了,肯定是前面拼的過程出了問題。

#include<stdio.h>
#include
<string.h>
#include
<stdlib.h>
int sum,N,n,L,a[100],vis[100];
int cmp(const void *_p,const void *_q)
{
int *p=(int *)_p;
int *q=(int *)_q;
return *q-*p;
}
int dfs(cur,complete,len)
{
int i;
if(len==L)
{
complete
++;
if(complete==N)
return 1;
else
{
for(cur=0;vis[cur];cur++);
vis[cur]
=1;
if(dfs(cur+1,complete,a[cur]))
return 1;
vis[cur]
=0;
}
}
else
{
for(i=cur;i<n;i++)
if(!vis[i]&&a[i]<=L-len)
{
if(i!=0&&a[i]==a[i-1]&&!vis[i-1])
continue;
vis[i]
=1;
if(dfs(i+1,complete,len+a[i]))
return 1;
vis[i]
=0;
if(a[i]==L-len)
return 0;
}
}
return 0;
}
int main()
{
int i,j,k,max;
while(1)
{
scanf(
"%d",&n);
if(n==0)
break;
sum
=max=0;
for(i=0;i<n;i++)
{
scanf(
"%d",&a[i]);
if(a[i]>max)
max
=a[i];
sum
+=a[i];
}
qsort(a,n,
sizeof(a[0]),cmp);
memset(vis,
0,sizeof(vis));
for(L=max;L<=sum/2;L++)
{
if(sum%L!=0)
continue;
N
=sum/L;
if(dfs(0,0,0))
break;
}
if(L>sum/2)
printf(
"%d\n",sum);
else
printf(
"%d\n",L);
}
return 0;
}

  

轉載于:https://www.cnblogs.com/staginner/archive/2011/09/08/2171329.html

總結

以上是生活随笔為你收集整理的UVA 307 Sticks的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。