給一組數,分為兩組,求差最小的情況

萌墨發表於2024-05-24
題目:

題目程式碼:

#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;
}

相關文章