POJ1011 HDU1455 UVA307 UVALive5522 Sticks题解

代码来源:DeathYmz


AC的C++语言程序如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
//dfs 判断是否ok
int a[100],n,vis[100],L,last;
//dfs+剪枝
//1-对拼接到一半发现不能拼接-保留-寻找 
//2-
bool dfs(int m,int l)//还剩下棍子和当前拼接剩余长度 
{
	if(m==0&&l==0) return true;
	if(l==0) l=L;
	int s=0;
	if(l!=L)
	s=last+1;//确保从未拼接的部分开始 
	for(int i=s;i<n;i++)
	{
		if(!vis[i-1]&&i>0&&a[i]==a[i-1]) continue;//长度相同跳过 
		if(!vis[i]&&a[i]<=l){
			vis[i]=1;
			last=i;//1
			if(dfs(m-1,l-a[i])) return true;
			else{
				vis[i]=0;
				if(l==L||a[i]==l) return false;//调整该次拼接的拼法 
			}
		}
	}
	return false; 
} 
bool cmp(int a,int b){ return a>b; }
int main()
{ 
	while(scanf("%d",&n)!=EOF&&n)
	{
		memset(a,0,sizeof(a));
		int sum=0,l_max=0;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			sum+=a[i];
			if(a[i]>l_max)
			l_max=a[i];
		}
		sort(a,a+n,cmp);//从大到小排序 
		int i;
		for(i=l_max;i<=sum/2;i++)
		{
			last=0; 
			memset(vis,0,sizeof(vis));
			L=i;
			if(sum%i==0)
			if(dfs(n,i))
			{
				printf("%d\n",i);
				break;
			}
		}
		if(i>sum/2)
		printf("%d\n",sum);
	} 
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值