标签:output std lin pre 排序 style content 选中 rip
这道题的意思讲得不明朗啊。大概意思是从若干个数中挑选出几个数,使这些被选出的数之和大于总和的一半,并且满足:被选出的数之和减去这些数中的最小数,得到的值小于总和的一半。然后用f[j]表示当前能不能使得数之和达到j,枚举i个数,若f[j]==true且j<=总数一半,就把j+a[i]标成true。
这里还有一个细节,被选出的数之和减去这些数中的最小数,得到的值小于总和的一半。我们可以先将政党的人数先由大到小排序,我们由大到小枚举,这样就可以保证当前取的一定是所有已取得政党中的最小值。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int a[100100],n,ans,sum; 6 bool f[100100]; 7 int main() 8 { 9 cin>>n; 10 ans=0; 11 for (int i=1;i<=n;i++) 12 { 13 cin>>a[i]; 14 sum+=a[i]; 15 } 16 sort(a+1,a+n+1); 17 f[0]=true; 18 for (int i=n;i>=1;i--) 19 for (int j=sum/2;j>=0;j--) 20 if (f[j]) 21 { 22 f[j+a[i]]=true; 23 if (j+a[i]>ans) ans=j+a[i]; 24 } 25 cout<<ans<<endl; 26 return 0; 27 }
http://www.lydsy.com/JudgeOnline/problem.php?id=1334
标签:output std lin pre 排序 style content 选中 rip
原文地址:http://www.cnblogs.com/Patrick-X/p/6230151.html