求助,WA+TLE0分
查看原帖
求助,WA+TLE0分
1362599
Great_White_Shark楼主2024/8/19 20:53
#include <bits/stdc++.h>
using namespace std;
int n,c1,c2,a[10010],b[10010],ans=1e9;
int f(int x)
{
    int res=0;
    for(;x;x&=x-1) res++;
    return res;
}
void DFS(int len,int cost)
{
    if(len==1)
    {
        ans=min(ans,cost); //更新答案
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]==-1) continue; //代表这个数已经删除
        for(int j=1;j<=n;j++)
        {
            if(a[j]==-1) continue; //代表这个数已经删除
            else
            {
                int t1=a[i],t2=a[j];
                t1^=t2; //算出xor值
                int x=f(l); //算出lowbit值
                if(x==1)
                {
                    a[i]=-1;
                    DFS(len-1,cost+c1); //算代价
                    a[i]=b[i]; //回溯
                    a[j]=-1;
                    DFS(len-1,cost+c1); //算代价
                    a[j]=b[j]; //回溯
                }
                else if(x>1)
                {
                    a[i]=-1; 
                    DFS(len-1,cost+c2); //算代价
                    a[i]=b[i]; //回溯
                    a[j]=-1; 
                    DFS(len-1,cost+c2); //算代价
                    a[j]=b[j]; //回溯
                }
            }
        }
    }
}
int main()
{
    cin>>n;
    cin>>c1>>c2;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i]; //记录一开始的a[i]
    }
    DFS(n,0);
    cout<<ans;
    return 0;
}

暴力DFS

2024/8/19 20:53
加载中...