猫狗大战【计蒜客】

猫狗大战【计蒜客】_第1张图片

  • 状态表示:f[i][j] : 用i个数能不能填体积为j
  • 枚举状态 : 从大到小枚举,从小到大=完全背包了,物品是有限的,所以从小到大枚举
  • 状态转移 : f[i][j] |= f[I-1][j-v]
#include
#include
#include
#include
#include
#include
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;
}

你可能感兴趣的:(动态规划,蓝桥杯)