P1120小木棍

该代码实现了一个使用深度优先搜索(DFS)解决木棍组合问题的C++程序。程序首先读取木棍长度,然后进行排序,尝试从最长的木棍开始组合,以达到特定长度。优化的cin用于提高输入效率,而scanf未通过测试。程序通过回溯策略寻找可行的木棍组合方案。

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

算法分析详见《算法进阶指南》

//毒瘤  最后一个点 用优化的cin过了  scanf没过, 
#include <bits/stdc++.h>
using namespace std;
const int N=100;
int n,cnt,a[N],v[N],sum,len,val;
bool cmp(int a,int b){
	return a>b;
}
bool dfs(int stick,int cab,int last){
	//stick当前拼的第stick木棍
	//cab当前木棍拼好的长度
	//已经试到了第last根小木棍 
    if(stick>cnt){
        return 1;//找到合适的拼凑方案 
    }
    if(cab==len)return dfs(stick+1,0,1);//一定要return 
    int fail=0;//记录失败的木棍长度 
    for(int i=last;i<=n;i++){
        if(!v[i]&&cab+a[i]<=len&&fail!=a[i]){
            v[i]=1;
            if(dfs(stick,cab+a[i],i+1))return 1;
            //失败后回溯,包括标记回溯,当前木棍长度记录 
            v[i]=0;
			fail=a[i];//失败的相同长度的木棍不用考虑了 
			if(cab==0||cab+a[i]==len)return 0; //当前是一根新木棍或者当前刚好可以凑成一根完整木棍都失败就是当前分支失败了 
//			int j=i;
//        	while(j<=n&&a[j]==a[i])j++;
//       		 i=j-1;  
        }
    }
    return 0;

}
int main(){
	 ios::sync_with_stdio(false);
    while(cin>>n&&n){
        sum=0,val=0;  //val要初始化  
       // memset(v,0,sizeof v);
        for(int i=1;i<=n;i++){
            //scanf("%d",&a[i]);
//            if(a[i]>50){
//            	i--;
//            	n--;
//            	continue;
//			}
			cin>>a[i];
            sum+=a[i];
            val=max(a[i],val);
        }
        sort(a+1,a+n+1,cmp);//先用长木棍 
        //reverse(a+1,a+n+1);
        for(len=val;len<=sum;len++){//从当前最长的短木棍试起 
            if(sum%len)continue;//如果无法整除len++ 
            cnt=sum/len;
            memset(v,0,sizeof v);
            if(dfs(1,0,1))break;
            
        }
        cout<<len<<endl;
	//	printf("%d\n",len);
    }
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值