dp升级 power oj 2784 上决╇ф人员分配问题

2784: ​上决╇ф人员分配问题

Time Limit: 1000 MS Memory Limit: 65536 KB

Submit Status Discuss

上决╇ф招募了2×n2×n个ACMer,准备奇袭Ceph老巢。这2×n2×n个人的编号分别为12n1−2n,第ii和人的战斗力为aiai。现在上决╇ф要把这些ACMer分为两组,每组nn个人,并且要使这两组人的战斗力的和的差值最小。上决╇ф想知道这个最小差是多少,知己知彼,百战不殆。

第一行一个整数nn1n151≤n≤15),代表​上决╇ф招募了2n2∗n个ACMer。
接下来一行,包含2n2∗n个整数cici1ci301≤ci≤30),分别代表这个2n2∗n个ACMer的战斗力。
输出一个正整数,代表战斗力总和的最小差值

#include<iostream>

#include<cstring>

using namespace std;

const int maxn = 500;

int main()

{

    int  a[50],f[31][maxn][31];//f[i][j][k],i表示前i个人可以被选取,j表示总的能力值,k表示选取的人员个数

    memset (f,0,sizeof(f));

    int   n,sum=0;

    cin>>n;

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

    {

        cin>>a[i];

        sum+=a[i];

    }

    int h=sum;

    sum/=2;//一组越接近中能力值的一半,则两组的差值越小

    for(int i=0;i<2*n;i++)f[i][0][0]=1;//初始化

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

    {

        

        for(int j=sum;j>=0;j--)

        {

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

            {   //核心代码,

                if(j<a[i]||!f[i-1][j-a[i]][k-1])//如果j不能满足a[i],或者f[i-1][j-a[i]][k-1](上一个值)不存在时,f[i][j][k]是否存在取决于f[i-1][j][k]

                    f[i][j][k]=f[i-1][j][k];

                else

                    f[i][j][k]=1;//若上一个值存在,f[i][j][k]就存在

            }

        }

    }

    for(int i=sum;i>=0;i--)

    {

        if(f[2*n][i][n])

        {

            cout<<h-2*i<<endl;

            break;

        }

    }

    return 0;

}




阅读更多
博主设置当前文章不允许评论。

没有更多推荐了,返回首页

不良信息举报

dp升级 power oj 2784 上决╇ф人员分配问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭