问题标题: 酷町堂:1531 公正的比赛

0
1
已解决
黄俊博
黄俊博
资深光能
资深光能

1531公正的比赛

各位大老,为何0分

#include<iostream>
using namespace std;

int data[10000],ans_a[10000],ans_b[10000];
int n,count;
bool used[10000];

bool check()
{
    int total_a=0,total_b=0;
    for(int i=1;i<=n;i++)
        total_a+=ans_a[i];
    for(int i=1;i<=n;i++)
        total_b+=ans_b[i];
    if(total_a==total_b)
        return 1;
    return 0;
}

void search(int t)
{
    if(check())
    {
        count++;
        return ;
    }
    for(int i=t;i<=n-t;i++)
    {
        if(!used[i])
        {
            used[i]=true;
            ans_a[t]=data[i];
            search(t+1);
            used[i]=false;
        }
    }
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>data[i];
    search(1);
    cout<<count;
    return 0;
}

@ 邵逸儒

@梁彦博 

@张睿杰 

@蒋智航 

@陆麟瑞 

注:虽是动规,我用搜索,请找一下错

 

 


1
已采纳
梁锦程
梁锦程
高级光能
高级光能

搜索和DP不一样,建议用DP

简单的01背包,输入后将数组累和;然除以2,再把第一个背包初始化f[0]=1;

for(int i=1;i<=n;++i)

for(int j=sum;j>=val[i];--j)

f[j]+=f[j-val[i]];

cout<<f[sum]/2<<endl;/*注意一定要/2输出,因为方案包括了分组的另一半*/

0
0
我要回答