上决╇ф人员分配问题
题目
样例
思路
dp[i][j][k]表示前i个人中选j个人能否组合出值为k的情况。
代码
#include<iostream>
#include<cmath>
using namespace std;
bool dp[35][20][505];
int a[35];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int sum=0;
dp[0][0][0]=1;
for (int i=1;i<=2*n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
dp[i][0][0]=1;
}
for(int i=1;i<=2*n;i++)
for(int j=1;j<=min(i,n);j++)
for(int k=1;k<=sum/2;k++)
{
dp[i][j][k]=dp[i-1][j][k];
if(k>=a[i]&&dp[i-1][j-1][k-a[i]])
dp[i][j][k]=1;//前i个人中选j个人能否组合出值为k
}
int ans=0;
for(int i=1;i<=sum/2;i++)
if(dp[2*n][n][i]) ans=i;
printf("%d\n",abs(sum-2*ans));
}
return 0;
}