在这里插入图片描述

  • 状态表示: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;
}
 posted on 2020-04-04 11:43  谁是凶手1703  阅读(125)  评论(0)    收藏  举报