1. 程式人生 > >bzoj 1334: [Baltic2008]Elect(luogu 4394)貪心+01揹包

bzoj 1334: [Baltic2008]Elect(luogu 4394)貪心+01揹包

演算法:貪心+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 ;
}