您的位置:首页 > 其它

poj3187 穷竭搜索 <挑战程序设计大赛>

2018-01-30 22:07 302 查看
2018-1-30

直接用dfs求解即可,一开始的时候提交TLE,后来优化一下就OK了!

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

const int N = 10;
int x[N+1],y[N+1],z[N+1];
bool f[N+1];
int n,s,sum;

int cal(){
int cnt=n;
sum=0;
for (int i=0;i<n;i++) z[i]=x[i];
while (cnt!=1){
for (int i=0;i<cnt-1;i++){
int t=z[i]+z[i+1];
z[i]=t;
}
cnt--;
}
sum=z[0];
return sum;
}

void dfs(int step){
if (step>n) return;
if (step==n){
cal();
if (sum==s){
for (int i=0;i<n;i++){
y[i]=x[i];
}
}
return;
}
for (int i=1;i<=n;i++){
if (!f[i]){
if (i>y[step]) return;
//在这里进行优化,因为我们要保证得到的字典序是最小的,所以要求的不能大于已知的对应的那个值
x[step]=i;
f[i]=true;
dfs(step+1);
f[i]=false;
}
}
}

int main(){
while (cin>>n>>s){
memset(f,false,sizeof(f));
memset(y,0x3f,sizeof(y));
dfs(0);
for (int i=0;i<n-1;i++){
cout<<y[i]<<" ";
}
cout<<y[n-1]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 搜索