c++深搜N个数全排+狂暴石

一:全排------------------------------------------------------
例如 :
输入: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;
}

猜你喜欢

转载自blog.csdn.net/cuijunrongaa/article/details/103262086
今日推荐