bzoj 1334: [Baltic2008]Elect(luogu 4394)貪心+01揹包
阿新 • • 發佈:2018-12-12
演算法:貪心+01揹包
難度:NOIP
首先,我們對讀入的n個數從大到小排序,這樣可以儘可能保證拿走“某個政黨退出後,其它黨的席位仍大於總
數的一半”,然後列舉的時候從sum/2開始就好啦!
學了1年了,居然還不知道給dp陣列賦初值...逃
程式碼如下:
#include <cstdio> #include <iostream> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <queue> #define N 100005 #define ll long long using namespace std; int a[305]; int cmp(int x,int y){return x > y;} int sum,ans; int dp[N]; int main() { int n; scanf("%d",&n); for(int i = 1;i <= n;i++) { scanf("%d",&a[i]); sum+=a[i]; } sort(a+1,a+1+n,cmp); dp[0]=1;//DP永遠不要忘記賦初值!!! for(int i = 1;i <= n;i++) { for(int j = sum/2+a[i];j >= a[i];j--) { if(dp[j-a[i]]) dp[j]=1,ans=max(ans,j); } } printf("%d\n",ans); return 0 ; }