这代码是如何保证解最优的
查看原帖
这代码是如何保证解最优的
434015
Calanosay楼主2021/4/6 20:30
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e4+5;
int n,maxx,ans[maxn];
bool dfs(int step){
	if(ans[step-1]*(1<<(maxx-step+1))<n)	return false;
	if(step>maxx)	return ans[step-1]==n;
	for(int i=0;i<step;i++)
		for(int j=i;j<step;j++){
			int now=ans[i]+ans[j];
			if(now>n)	break;
			if(now<=ans[step-1])	continue;
			ans[step]=now;
			if(dfs(step+1))	return true;
		}
		return false;
}
signed main(){
	ans[0]=1;
	while(cin>>n&&n){
		printf("1");
		for(maxx=;;maxx++){
			if(dfs(1)){
				for(int i=1;i<=maxx;i++)	printf(" %lld",ans[i]);
				puts("");
				break;
			}
		}
	}
}

迭代加深板子题,这是AC代码,但是无法理解,dfs里面i和j都是从小开始枚举的,应该是无法保证路径最短的吧,但是确实保证了路径最短,这是为什么?

2021/4/6 20:30
加载中...