自己找不到理由说这个方法不对。 dp[位置][选择个数][是否选当前位置] dp[pos][i][0]=max(dp[pos−1][i][0],dp[pos−1][i][1]); dp[pos][i][1]=max(dp[pos−1][i−1][0],dp[pos−1][i−1][1])+a[pos];
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=101;
int dp[maxn][maxn][2];
int k,ans;
int a[maxn];
int n;
int sum;
int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
sum+=a[i];
}
int step=n/2;
int ans=0;
for(int pos=1; pos<=n; pos++) {
for(int i=1; i<=step; i++) {
dp[pos][i][0]=max(dp[pos-1][i][0],dp[pos-1][i][1]);
dp[pos][i][1]=max(dp[pos-1][i-1][0],dp[pos-1][i-1][1])+a[pos];
}
}
for(int pos=1; pos<=n; pos++) {
for(int i=0; i<=1; i++) {
if(dp[pos][step][i]<=sum/2){
ans=max(ans,dp[pos][step][i]);
}
}
}
cout<<ans;
return 0;
}