http://acm.hdu.edu.cn/showproblem.php?pid=4104
题意:
给出n个数,每个数最多只能用一次,每次可以选任意个数相加,求不能相加得到的最小值是多少。
思路:
先排序并计算出前缀和。
现在如果前k个数能组成[1,$sum_{k}$]之间的所有数,那么再新加入$a_{k+1}$后,就可以组成[$a_{k+1}$,$a_{k+1}+sum_{k}$]之间的所有数,那么这两个区间不能有间隔。所以必须满足$a_{k+1}$<=$sum_{k}$+1。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 int a[1005], sum[1005]; 7 8 int main() 9 { 10 int n; 11 sum[0] = 0; 12 while(~scanf("%d",&n)) 13 { 14 for(int i=1; i<=n; i++) 15 { 16 scanf("%d",&a[i]); 17 sum[i] = sum[i-1]+a[i]; 18 } 19 sort(a+1,a+n+1); 20 int i; 21 for(i=1; i<=n; i++) 22 { 23 if(a[i]>sum[i-1]+1) break; 24 } 25 printf("%d ",sum[i-1]+1); 26 } 27 return 0; 28 }