装箱问题

装箱问题【加强版 】题解

应该没有人会关心我这个唐题,但是我还是写一篇题解

首先我造的数据除了数据范围外,其实数据都还挺水的,奈何造多了 ,能卡掉一些小贪心还是可以的

我要介绍一位你们很熟悉的老朋友: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;
} 


posted @ 2025-11-30 11:13  2068_hht  阅读(0)  评论(0)    收藏  举报