zoukankan      html  css  js  c++  java
  • TCSRM 591 div2(1000)(dp)

    挺好的dp 因为有一点限制 必须任意去除一个数 总和就会小于另一个总和 换句话来说就是去除最小的满足 那么就都满足

    所以是限制最小值的背包 刚开始从小到大定住最小值来背 TLE了一组数据 后来发现如果从大到小的话 就不用多加一重for了  前面算的已经记录下来 直接用就OK了 

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 using namespace std;
     8 #define LL long long
     9 #define N 3000010
    10 LL dp[N],sum[N];
    11 int a[55],b[55];
    12 bool cmp(int a,int b)
    13 {
    14     return a>b;
    15 }
    16 class YetAnotherTwoTeamsProblem
    17 {
    18     public:
    19     long long count(vector <int> skill)
    20     {
    21         int i,j,k,n;
    22         for(i = 0 ; i < (int)skill.size() ; i++)
    23         a[i+1] = skill[i];
    24         LL ss=0,s=0;
    25         n = (int)skill.size();
    26         for(i = 1 ;i <= n ;i++)
    27         {
    28             s+=a[i];
    29         }
    30         sort(a+1,a+n+1,cmp);
    31         for(i = 1 ; i <= n ;i++)
    32         sum[i]=sum[i-1]+a[i];
    33         LL v = (s+1)/2;
    34         LL vv = s/2;
    35         dp[0] = 1;
    36         for(i = 1; i < n ;i++)
    37         {
    38             for(k = v-1 ; k >= a[i] ; k--)
    39             {
    40                 dp[k]+=dp[k-a[i]];
    41             }
    42             if(a[i]>vv)
    43             ss+=1;
    44             int tt;
    45             if(vv-a[i+1]+1<0)
    46             tt = 0;
    47             else
    48             tt = vv-a[i+1]+1;
    49             for(j = tt ; j < v ;j++)
    50             ss+=dp[j];
    51         }
    52         return ss;
    53     }
    54 };
    View Code
  • 相关阅读:
    IP地址加时间戳加3位随机数
    你会想造一艘船吗?
    提问的智慧
    建造者模式
    设计模式(一)
    jeesite中activiti中的流程表梳理
    如何读书、学习?
    zxing生成高容错率二维码,以及添加文字
    LVM磁盘划分
    阿里云盘扩容(SUSE Linux下)
  • 原文地址:https://www.cnblogs.com/shangyu/p/3352668.html
Copyright © 2011-2022 走看看