1. 程式人生 > >Luogu 2737 [USACO4.1]麥香牛塊Beef McNuggets

Luogu 2737 [USACO4.1]麥香牛塊Beef McNuggets

amp one close print span eve splay play 技術分享

NOIP2017 D1T1 的結論,兩個數$a, b$所不能表示出的最大的數為$a * b - a - b$。

聽了好幾遍證明我還是不會

註意到本題中給出的數都非常小,所以最大不能表示出的數$\leq 256 * 256 - 256 * 2 = 65024$。

那麽直接用這個$65024$作為背包容量跑完全背包就好了。

時間復雜度$O(maxV * n)$。

Code:

技術分享圖片
#include <cstdio>
using namespace std;

const int N = 15;
const int M = 65030;

int n, a[N];
bool
f[M]; inline void read(int &X) { X = 0; char ch = 0; int op = 1; for(; ch > 9|| ch < 0; ch = getchar()) if(ch == -) op = -1; for(; ch >= 0 && ch <= 9; ch = getchar()) X = (X << 3) + (X << 1) + ch - 48; X *= op; }
int main() { read(n); for(int i = 1; i <= n; i++) read(a[i]); f[0] = 1; for(int i = 0; i < M; i++) for(int j = 1; j <= n; j++) if(i - a[j] >= 0) f[i] |= f[i - a[j]]; int ans = 0; for(int i = 65029; i >= 0; i--) if(!f[i]) { ans
= i; break; } if(ans > 65024) ans = 0; printf("%d\n", ans); return 0; }
View Code

Luogu 2737 [USACO4.1]麥香牛塊Beef McNuggets