思路:这个题怎么说呢,迷惑性很大,题目里说了交换了两个集合的时候如果有相同元素不能交换,感觉如果没
这句话能很快写出来, 其实当交换的两个集合有重复元素的时候只要交换那些不重复的就好啦,这样就相当于能
交换两个有交的集合,那么对于两个集合S1, S2我们不需要去考虑有没有交只需要考虑sumS1 + d >= sumS2是否
满足条件。所以求个背包从前往后贪心就好啦。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pair<int, int> #define SZ(x) ((int)x.size()) #define ull unsigned long long using namespace std; const int N = 50 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-8; int n, d, c[N], all, day; bitset<500001> dp; int main() { scanf("%d%d", &n, &d); dp[0] = 1; for(int i = 1; i <= n; i++) { int x; scanf("%d", &x); dp |= dp << x; } while(1) { int nxt = -1; for(int i = all+1; i <= all+d && i <= 500000; i++) { if(dp[i]) { nxt = i; } } if(nxt == -1) break; day++; all = nxt; } printf("%d %d ", all, day); return 0; } /* */