信息学奥赛一本通T1442-小木棍【dfs】
信息学奥赛一本通T1442-小木棍 - C语言网 (dotcpp.com)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N=1e5+100;
int n;
int res=1e9;
int a[N],p=0,sd=0;
bool vis[N];
bool dfs(int i,int cnt,int spd,int len)
//i:上一个木棍编号,cnt:已经拼好的木棍数,spd:剩余的长度,len:木棍的长度
{
if(cnt==p&&spd==0)//木棍全部使用且剩余长度为0
return true;
else if(cnt==p)//木棍全部使用了但是有剩余的长度
return false;
else if(spd==0)//木棍还未使用完,但剩余长度已经为0
{
spd=len;//重置剩余长度
i=1;//又从1号开始选
}
for(int k=i;k<=n;k++)
{
if(vis[k])//已经选了的
continue;
if(spd-a[k]>=0)//这长度的木棍可选
{
vis[k]=true;
if(dfs(k,cnt+1,spd-a[k],len))
return true;
vis[k]=false;
}
}
return false;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(x<=50)
{
a[++p]=x;
sd+=x;
}
}
sort(a+1,a+n+1,[&](int a,int b){return a>b;});
//长度从大到小排序
for(int i=a[1];i<=sd;i++)
{
if(sd%i==0)//能被总长度整除的长度才有可能
{
if(dfs(1,0,i,i))
{
cout<<i;
break;
}
}
}
return 0;
}
原文地址:https://blog.csdn.net/2302_77047789/article/details/137715675
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!