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石子归并问题
下一篇Crossing River
博主设置当前文章不允许评论。

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

关闭
关闭