#include <algorithm> #include <cstdio> using namespace std; typedef pair<int,int> PII; #define REP(i,n) for(int i=0;i<(n);++i) #define ST first #define ND second const int MAXN = 24; const int MAXM = 110; int n, m; int W[MAXN], C[MAXM]; PII dp[(1<<MAXN)+3]; int main(int argc, char *argv[]) { scanf("%d %d", &n, &m); REP(i,n) scanf("%d", W+i); REP(i,m) scanf("%d", C+i); sort(W, W+n, greater<int>()); sort(C, C+m, greater<int>()); if(n < m) { REP(i,m-n) C[n+i] = 0; m = n; } dp[0] = {0, -C[0]}; for(int mask=1;mask<(1<<n);mask++) { PII r(m, 0); for(int i=0;(1<<i)<=mask;i++) { if(!(mask & (1<<i))) continue; PII sub = dp[mask ^ (1<<i)]; PII t(sub.ST+1, -C[sub.ST+1]+W[i]); if(t.ND > 0) t.ST = m; if(sub.ND <= -W[i] && (sub.ST < t.ST || (sub.ST == t.ST && sub.ND+W[i] < t.ND))) t = PII(sub.ST, sub.ND+W[i]); if(t.ST < r.ST || (t.ST == r.ST && t.ND < r.ND)) r = t; } if(r.ND > 0) r = PII(m, 0); dp[mask] = r; } int res = dp[(1<<n)-1].ST; if(res == m) printf("NIE\n"); else printf("%d\n", res+1); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <algorithm> #include <cstdio> using namespace std; typedef pair<int,int> PII; #define REP(i,n) for(int i=0;i<(n);++i) #define ST first #define ND second const int MAXN = 24; const int MAXM = 110; int n, m; int W[MAXN], C[MAXM]; PII dp[(1<<MAXN)+3]; int main(int argc, char *argv[]) { scanf("%d %d", &n, &m); REP(i,n) scanf("%d", W+i); REP(i,m) scanf("%d", C+i); sort(W, W+n, greater<int>()); sort(C, C+m, greater<int>()); if(n < m) { REP(i,m-n) C[n+i] = 0; m = n; } dp[0] = {0, -C[0]}; for(int mask=1;mask<(1<<n);mask++) { PII r(m, 0); for(int i=0;(1<<i)<=mask;i++) { if(!(mask & (1<<i))) continue; PII sub = dp[mask ^ (1<<i)]; PII t(sub.ST+1, -C[sub.ST+1]+W[i]); if(t.ND > 0) t.ST = m; if(sub.ND <= -W[i] && (sub.ST < t.ST || (sub.ST == t.ST && sub.ND+W[i] < t.ND))) t = PII(sub.ST, sub.ND+W[i]); if(t.ST < r.ST || (t.ST == r.ST && t.ND < r.ND)) r = t; } if(r.ND > 0) r = PII(m, 0); dp[mask] = r; } int res = dp[(1<<n)-1].ST; if(res == m) printf("NIE\n"); else printf("%d\n", res+1); return 0; } |