题面:
状态表示:f[i][j]:表示前i个物品中差值为j的最大重量.
属性:Max
状态计算:f[i][j]=max(f[i-1][j] , f[i][j+a[i]] + a[i] , f[i][abs(j-a[i])] + a[i]);三者的最大值
初始化为负无穷
因为初始状态f[i][j]的值不一定为0,而应该是一个不存在的值.所以应该是负无穷
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
int n,m;
int a[maxn];
int f[maxn][10005];
int main(){
cin>>n>>m;
int sum=0;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
memset(f,-0x3f,sizeof(f));
f[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=sum;j++){
f[i][j]=max(f[i-1][j],f[i-1][abs(j-a[i])]+a[i]);
f[i][j]=max(f[i][j],f[i-1][j+a[i]]+a[i]);
}
}
int ans=0;
for(int i=0;i<=m;i++) ans=max(ans,f[n][i]);
cout<<ans<<endl;
return 0;
}