题目:
题目代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int dp[10050][105];//规定dp[i][j]是差为i,遍历到第j个的情况是否存在,差最大为10000,有边界,所以可以枚举
int a[10005];
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
cin>>n;
long long sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
dp[a[1]][1]=1;
for(int i=2;i <= n;i ++)
{
for(int j=0;j<=sum;j++)
{
dp[j+a[i]][i]|=dp[j][i-1];//如果前一个存在,后一个必存在,要用|=,只要有一个存在就存在
dp[abs(j-a[i])][i]|=dp[j][i-1];//要么第i个分到第一堆,要么第i个分到第二堆,两种情况都看一下
}
}
//最大的差其实为和
for(int i=0;i<=sum;i++)
{
if(dp[i][n])
{
cout<<i*sum<<endl;
break;//要跳出循环,因为要最小的差,所以找到后就跳出循环
}
}
return 0;
}
标签:一组,int,求差,cin,long,sum,两组,dp From: https://www.cnblogs.com/2681089286lym/p/18211636