分析:如果每个数可以选任意多次,那么就是一个很普通的dp问题,这里每个数只能选一次,还是考虑dp,设f(i)表示1~i是否都能选上.考虑下一个数j,如果j > i + 1,那么i+1这个数就选不上,答案就是i+1,否则f(i)可以转移到f(i + j),这个算法是建立在集合有序的情况下的,所以要先排序.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n, a[100010]; long long sum; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); sort(a + 1, a + 1 + n); for (int i = 1; i <= n; i++) { if (a[i] > sum + 1) { printf("%lld\n", sum + 1); return 0; } else sum += a[i]; } printf("%lld\n", sum + 1); return 0; }