其他都是自己写的,主要是题解的精华
我们把从发现超过目标时所计算到的位开始,一直到结束的所有位排序成从大到小
但只拿了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;
}
另外不是很理解为什么这样排序之后答案不会出错