我是靠谱客的博主 纯真面包,最近开发中收集的这篇文章主要介绍Addition Chains poj,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.搜索顺序:从从大到小枚举,可以实现一部分的剪枝,个人感觉就是在枚举小的时候可能会超过最优解,直接return。
2.其实每次枚举只需要一个循环,我还很sb的要两个循环,因为剩下的循环之前已经完成了,没有必要继续下去。
3.注意输入输出格式,数组不要开小。
代码如下

#include<iostream>
#include<cstdio>
using namespace std;

int ans[100000],a[100000];int m,cnt;

void dfs(int step){
    if(a[step-1]==m&&(step-1)<cnt){
    	cnt=step-1;
    	for(int i=1;i<=step-1;++i)ans[i]=a[i];
	    return;
	}
	if(step>cnt)return;
    if(a[step-1]>m)return;
    for(int i=step-1;i>=1;--i){
    	if(a[step-1]+a[i]<=m){
    		a[step]=a[i]+a[step-1];
			dfs(step+1);a[step]=0;
		}
	}
}

int main(){
	a[1]=1;cnt=99999999;
    while(scanf("%d",&m)!=EOF) {
       if(m==0)break;
        else{
            a[1]=1;  
            cnt=999999;  
            dfs(2);  
            for(int i=1;i<=cnt;i++) printf("%d ",ans[i]);  
            printf("n");
        }
        memset(ans,0,sizeof(ans));memset(a,0,sizeof(a));
    }
	return 0;
}

感想:第一点代码能力不行,找错能力不行,有思路写不出来。有大思路,小细节写不出来

最后

以上就是纯真面包为你收集整理的Addition Chains poj的全部内容,希望文章能够帮你解决Addition Chains poj所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部