1 条题解

  • 1
    @ 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

信息

难度
4
分类
动态规划 | 背包 点击显示
标签
递交数
1
已通过
1
通过率
100%
上传者