一:全排------------------------------------------------------
例如 :
输入:3
输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<iostream>
#include<math.h>
using namespace std;
int n;
int used[1000];
int pre[10000];
void pr()
{
for(int i=0; i<n; i++)
cout<<pre[i]<<' ';
cout<<endl;
}
void f(int x)
{
if(x==n)
{
cout<<"结果:";//当满足n个值输出
pr();
}
else
{
for(int i=1; i<=n; i++)
{
if(!used[i])
{
used[i]=1;//如果被标记过,记录为1,原为0;
pre[x]=i;
f(x+1);
used[i] =0;***//记着标记后用完归原值***
}
}
}
}
int main()
{
cin>>n;
f(0);
return 0;
}
二:狂暴石
蒜头君的仓库中有 nn 块狂暴石,每块狂暴石有两个属性:愤怒和暴躁。携带这些狂暴石会获得相应的属性,具体来说:总的愤怒值为所有狂暴石愤怒值之积,总的暴躁值为所有狂暴石暴躁值之和。现在蒜头君想知道,如何选取狂暴石(不能一块都不选),可以使得总愤怒值和总暴躁值相差的最少。现在请你帮帮他,计算出这个相差最小的值。输入格式
第一行一个整数 n\ (1\le n \le 10)n (1≤n≤10)。接下来 nn 行,每行两个空格分隔的整数,分表表示一块狂暴石的愤怒值和暴躁值。
数据保证,所有愤怒值之积和所有暴躁值之和都在int范围内。
输出格式
一个整数,表示总愤怒值和总暴躁值最小的差值。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
4
1 7
2 6
3 8
4 9
样例输出
1
#include<bits/stdc++.h>
using namespace std;
int a[105],b[105],u[100],n,s1=1,s2=0,ans=0x3f3f3f3f;
void bf(int s)
{
if(s<=n)
{
for(int i=0;i<n;i++)
{
if(!u[i])
{
s1*=a[i];
s2+=b[i];
ans=min(ans,abs(s1-s2));
u[i]=1;
bf(s+1);
u[i]=0;
s1/=a[i];
s2-=b[i];
}
}
}
}
int main()
{
int i;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i]>>b[i];
bf(1);
cout<<ans;
return 0;
}