测了几个样例,不知道对不对 //f[i][j]表示考虑前i个物品,两个背包的差值为j的情况下的最大重量和 //ans=f[n][0]/2 (即求出来的是最大的可能) #include <bits/stdc++.h> using namespace std; int f[105][2005]; int w[105]; int main() { int n; cin>>n; for (int i=1; i<=n; i++) cin>>w[i]; memset(f,-1,sizeof(f)); f[0][0]=0; for (int i=1; i<=n; i++) { for (int j=0; j<=2000; j++) { if (f[i-1][j]!=-1) { f[i][j]=max(f[i][j],f[i-1][j]); if (w[i]>j) f[i][w[i]-j]=max(f[i][w[i]-j], f[i-1][j]+w[i]); else f[i][j-w[i]]=max(f[i][j-w[i]],f[i-1][j]+w[i]); f[i][j+w[i]]=max(f[i][j+w[i]],f[i-1][j]+w[i]); } } } if (f[n][0]>0) cout<<f[n][0]/2<<endl; else cout<<"Impossible"<<endl; return 0; }
点赞 2
牛客网
牛客企业服务