1 条题解
-
1Vingying LV 5 MOD @ 2017-09-10 22:48:08
这题看上去并不是个dp?
看分类就知道这肯定是个dp。
这题要把一些数分成两部分,然后总和除以2算个平均值。
这个平均值......就是背包容量。
然后就是个0-1背包问题:从一堆数里面选取一些数,求最大总和是多少。
然后再处理一下就做出来了。然而这样只可以得部分分,因为题目数据规模问题,容易MLE(超空间)。
所以这道题具体看下面代码#include <stdio.h> #include <cstring> #include <iostream> using namespace std; int n,val[2005]; int dp[2005][10005]; int main() { memset(dp,0,sizeof(dp)); int i,j,len; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&val[i]); dp[0][5000]=1; for(i=1;i<=n;i++) { for(j=0;j<=10000;j++) { if(dp[i-1][j]) dp[i][j+val[i]]=dp[i][j-val[i]]=1; } } for(len=0;len<=5000;len++) { if(dp[n][5000+len]) { cout<<len<<endl; return 0; } } return 0; }
- 1