需要优化的01背包:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int dp[100005]; int main() { int n,i,j,v,tv,w[30]; while(~scanf("%d",&n)) { for(i=0,v=0;i<n;++i) { scanf("%d",&w[i]); v+=w[i]; } tv=v/2; //思路:最大差值--》一半总重量为容量的背包最多能装多少重量的西瓜 for(i=0;i<=tv;++i) dp[i]=0; for(i=0;i<n;++i) for(j=tv;j>=w[i];--j) { /* 赋值要耗费的时间比+,-,*,/更大,条件表达式是最缩减时间的 改用max会更悲剧,反正最后的结果都是TLE */ dp[j]=dp[j]>dp[j-w[i]]+w[i]?dp[j]:dp[j-w[i]]+w[i]; } printf("%d ",abs(v-dp[tv]*2)); } return 0; }