你有一个容量为\(w\)的背包,和\(8\)件物品,重量分别为\(1~8\)的整数,分别有\(cnt_1 ... cnt_8\),求最大容量。
解法
笨蛋chh一开始打了一个背包模板乱搞压缩容量\(j\)状态,结果搞爆炸了。
但是无意之间把对拍暴力交上去之后,\(a\)掉了。
冷静分析题目,数据范围容量\(w\)非常的大,那么我们就从数据规模小的\(8\)入手。
每次枚举有当前物品放几个,然后暴力乱搞就过掉了。事实证明:暴力出奇迹
瞎讲
我们其实做过\(01\)背包的容量压缩版,但是笨蛋\(chh\)就是调不对\(QwQ\)(蒟蒻太菜了),好像在洛谷比赛某一次出现过。
ac代码
\(*宣传一波:没有快读的代码是没有灵魂的\)
#include <bits/stdc++.h>
#define ms(a, b) memset(a, b, sizeof(a))
#define LL long long
using namespace std;
inline LL gll() {
LL w = 0, x = 0;
char ch = 0;
while (!isdigit(ch)) w |= ch == '-', ch = getchar();
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return w ? -x : x;
}
LL ans=0, w, a[15]
inline void dfs(int x, LL sum) {
if (x == 9) {
ans = max(ans, sum);
return;
}
LL v = min((w - sum) / x, a[x]);
for (int i = 1; i <= 9; i ++) //枚举当前物品放几件
dfs(x + 1, sum + max((LL)0, (v--) * x));
}
int main() {
w = gll();
for (int i = 1; i <= 8; i ++) a[i] = gll();
dfs(1, 0);
printf("%lld\n", ans);
return 0;
}
upd,这道题目还可以折半搜索,也就是搜完前一半匹配后一半。。。