//Jakub Sygnowski #include<cstdio> #include <algorithm> #include <vector> using namespace std; #define MAXN 25 #define MAXK 105 typedef long long ll; int n, k; ll miejsca; ll dospakowania; ll rzecz[MAXN], plecak[MAXK], pamiec[MAXK]; int act = 0, best = 10000000; int test; bool backtrack(int rz){ if (rz == n){ return true; } if (dospakowania > miejsca) return false; for(int i = 0; i < test; i++){ if (rzecz[rz] <= plecak[i]){ dospakowania -= rzecz[rz]; miejsca -= rzecz[rz]; plecak[i] -= rzecz[rz]; if (plecak[i] < rzecz[rz]){ pamiec[i] = plecak[i]; miejsca -= plecak[i]; plecak[i] = 0; } if (backtrack(rz+1)) return true; plecak[i] += rzecz[rz]; dospakowania += rzecz[rz]; miejsca += rzecz[rz]; if (pamiec[i]){ plecak[i] += pamiec[i]; miejsca += pamiec[i]; pamiec[i] = 0; } } else { pamiec[i] += plecak[i]; miejsca -= plecak[i]; plecak[i] = 0; } } return false; } int main(){ scanf("%d%d",&n,&k); for(int i = 0; i < n; i++){ scanf("%lld", &rzecz[i]); dospakowania += rzecz[i]; } sort(rzecz, rzecz + n); for(int i = 0; i < k; i++){ scanf("%lld", &plecak[i]); } sort(plecak, plecak + k); reverse(plecak, plecak + k); k = min(k, n); for(int i = 0; i < k; i++) miejsca += plecak[i]; for(int i = 1; i <= k; i++){ test = i; if (backtrack(0)){ printf("%d\n", test); return 0; } } printf("NIE\n"); // liczSume(); }
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | //Jakub Sygnowski #include<cstdio> #include <algorithm> #include <vector> using namespace std; #define MAXN 25 #define MAXK 105 typedef long long ll; int n, k; ll miejsca; ll dospakowania; ll rzecz[MAXN], plecak[MAXK], pamiec[MAXK]; int act = 0, best = 10000000; int test; bool backtrack(int rz){ if (rz == n){ return true; } if (dospakowania > miejsca) return false; for(int i = 0; i < test; i++){ if (rzecz[rz] <= plecak[i]){ dospakowania -= rzecz[rz]; miejsca -= rzecz[rz]; plecak[i] -= rzecz[rz]; if (plecak[i] < rzecz[rz]){ pamiec[i] = plecak[i]; miejsca -= plecak[i]; plecak[i] = 0; } if (backtrack(rz+1)) return true; plecak[i] += rzecz[rz]; dospakowania += rzecz[rz]; miejsca += rzecz[rz]; if (pamiec[i]){ plecak[i] += pamiec[i]; miejsca += pamiec[i]; pamiec[i] = 0; } } else { pamiec[i] += plecak[i]; miejsca -= plecak[i]; plecak[i] = 0; } } return false; } int main(){ scanf("%d%d",&n,&k); for(int i = 0; i < n; i++){ scanf("%lld", &rzecz[i]); dospakowania += rzecz[i]; } sort(rzecz, rzecz + n); for(int i = 0; i < k; i++){ scanf("%lld", &plecak[i]); } sort(plecak, plecak + k); reverse(plecak, plecak + k); k = min(k, n); for(int i = 0; i < k; i++) miejsca += plecak[i]; for(int i = 1; i <= k; i++){ test = i; if (backtrack(0)){ printf("%d\n", test); return 0; } } printf("NIE\n"); // liczSume(); } |