#include<stdio.h> #include<algorithm> #include<iostream> typedef unsigned long long LL; using namespace std; const int maxn = 40; LL INF = (1<<32)-1; //const LL INF = 0xFFFFFF; int n; LL w[maxn],v[maxn]; LL W,res; pair<LL,LL>ps[1<<(maxn/2)]; void solve() { int n2 = n/2; for(int i=0;i<1<<n2;i++) { LL sw=0,sv=0; for(int j=0;j<n2;j++) { if(i>>j&1) { sw+=w[j]; sv+=v[j]; } } ps[i]=make_pair(sw,sv); } sort(ps,ps+(1<<n2)); int m = 1; for(int i=1;i<1<<n2;i++) { if(ps[m-1].second<ps[i].second) { ps[m++]=ps[i]; } } for(int i=0;i<1<<(n-n2);i++) { LL sw=0,sv=0; for(int j=0;j<n-n2;j++) { if(i>>j&1) { sw+=w[n2+j]; sv+=v[n2+j]; } } if(sw<=W) { LL tv = (lower_bound(ps,ps+m,make_pair(W-sw,INF))-1)->second; res = max(res,sv+tv); } } printf("%lld ",res); } int main(void) { cin >> n; for(int i=0;i<n;i++) cin >> w[i]; for(int i=0;i<n;i++) cin >> v[i]; cin >> W; solve(); return 0; }
eg.数据在为long long 时候,不能使用(1<<32)-1,因为long long 最大值为(1<<31)-1