HDU 4104 Discount(n个数不能构成的最小值)

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 }
原文地址:https://www.cnblogs.com/zyb993963526/p/7883660.html