题面:https://www.luogu.com.cn/problem/P1489
看上去是一道简单的二维费用背包,但是要特别小心循环顺序。
Ⅰ先循环物品,再循环限制条件。
Ⅱ每一个限制条件都必须从后往前枚举,这样可以省下一维
#include <bits/stdc++.h> using namespace std; int n; int v[249]; int dp[209][9000]; int main() { int sumn=0; cin>>n; for(int i=1;i<=n;i++) { cin>>v[i]; sumn+=v[i]; } dp[0][0]=1; for(int i=1;i<=n;i++) for(int k=n/2;k>=1;k--) for(int j=sumn;j>=0;j--) if(j>=v[i]&&dp[k-1][j-v[i]]) dp[k][j]=1; for(int i=sumn/2;i>=0;i--) if(dp[n/2][i]) { cout<<i<<" "<<sumn-i; return 0; } }