![在这里插入图片描述]()
- 状态表示:f[i][j] : 用i个数能不能填体积为j
- 枚举状态 : 从大到小枚举,从小到大=完全背包了,物品是有限的,所以从小到大枚举
- 状态转移 : f[i][j] |= f[I-1][j-v]
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<unordered_set>
using namespace std;
const int N= 2e5+10;
bool f[300][N];
int a[N];
const int mod = 1e9+9;
int main(){
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=n;j>=1;j--)
for(int k=sum;k>=0;k--)
f[j][k] |= f[j-1][k-a[i]];
for(int i=sum/2;i>=0;i--)
if(f[n/2][i] || f[n/2+1][i] && (n&1))
{
cout<<i<<' '<<sum-i<<endl;
return 0;
}
return 0;
}