按照第二篇题解的思路写的
查看原帖
按照第二篇题解的思路写的
124564
Austra楼主2020/11/5 20:40

其他都是自己写的,主要是题解的精华

我们把从发现超过目标时所计算到的位开始,一直到结束的所有位排序成从大到小

但只拿了40分,其他全WA

#include<iostream>
#include<algorithm>
using namespace std;
int n,sum,a[13],b[13],c[13];
bool cmp(int a,int b){
	return a>b;
}
int main(){
	cin>>n>>sum;
	for(int i=1;i<=n;i++)a[i]=i;
	do{
		for(int i=1;i<=n;i++)c[i]=a[i];
		for(int j=n-1;j>=1;j--){
			for(int i=1;i<=j;i++)b[i]=c[i]+c[i+1];
			for(int i=1;i<=j;i++)c[i]=b[i]; 
			int x=0;
			for(int i=1;i<=j;i++){
				x+=c[i];
				if(x>sum){sort(a+i,a+n+1,cmp);break;}
			}
			if(x>sum)break;
		}
		if(c[1]==sum){
			for(int i=1;i<=n;i++)cout<<a[i]<<' ';
			return 0;
		}
	}while(next_permutation(a+1,a+n+1));
	return 0;
}

另外不是很理解为什么这样排序之后答案不会出错

2020/11/5 20:40
加载中...