f[s]表示s状态下的最小代价,g[s]表示s状态下的最大剩余体积
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
template <typename T> void in(T &x) {
x = 0; T f = 1; char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
while(isdigit(ch)) {x = 10*x+ch-'0'; ch = getchar();}
x *= f;
}
template <typename T> void out(T x) {
if(x < 0) putchar('-'),x = -x;
if(x > 9) out(x/10);
putchar(x%10+'0');
}
//-------------------------------------------------------------
int n,w,a[20],f[1<<20],g[1<<20];
int main() {
int i,j; in(n); in(w);
for(i = 0;i < n; ++i) in(a[i]);
memset(f,0x3f,sizeof(f));
f[0] = 0;
g[0] = 0;
for(i = 1;i < (1<<n); ++i) {
for(j = 0;j < n; ++j) {
if(!(i&(1<<j))) continue;
if(g[i&~(1<<j)]-a[j] >= 0 && f[i] >= f[i&~(1<<j)]) {
f[i] = f[i&~(1<<j)];
g[i] = max(g[i],g[i&~(1<<j)]-a[j]);
}
if(g[i&~(1<<j)]-a[j] < 0 && f[i] >= f[i&~(1<<j)]+1) {
f[i] = f[i&~(1<<j)]+1;
g[i] = max(g[i],w-a[j]);
}
}
}
out(f[(1<<n)-1]);
return 0;
}
现在写个输入输出都这么骚了吗?
??快读有什么不正常吗??
这里的表述是不是有误,g(x)表示的应该是状态在f(x)取得最小值的情况下所剩余的体积。