装箱问题【加强版 】题解
应该没有人会关心我这个唐题,但是我还是写一篇题解
首先我造的数据除了数据范围外,其实数据都还挺水的,奈何造多了 ,能卡掉一些小贪心还是可以的
我要介绍一位你们很熟悉的老朋友:bitset
想到了吧,dp状态设置为\(dp_i表示是否可以组装出这个体积\),显而易见的,\(dp_0 = 1\),那么就有这个唐龙伪转移方程了:
\(对于每个体积w,有dp = dp|dp<<w\)
还是很简单的,复杂度\(O(nv/64)\)
code:
#include<bits/stdc++.h>
#define gc() getchar()
#define pc(x) putchar(x)
using namespace std;
using ll = long long;
inline ll read(){ll res = 0;ll flag = 1;char ch = gc();while(!isdigit(ch)){if(ch == '-') {flag = -flag;}ch = gc();}while(isdigit(ch)){res = res*10+ch-48;ch = gc();}return flag*res;}
void write(ll x){if(x < 0){x = -x;pc('-');}if(x > 9){write(x/10);}pc(x%10+48);}int const maxv = 1e6+5;
bitset<maxv> b;int main(){int v = read();int n = read();b[0] = 1;while(n--){int w = read();b |= b<<w;}for(int i = v; i >= 0; --i){if(b[i]){write(v-i),pc('\n');return 0;}}return 0;
}