#include
using namespace std; int n; int c; int v[100]; int w[100]; int cw = 0; int cp = 0; int bestp = 0.0; int put[100]; int x[100]; void backtrack(int i) {
int bound(int i); if(i>n) {
for(int j=1;j<=n;j++) put[j]=x[j]; bestp = cp; return; } if(cw+w[i]<=c) {
cw+=w[i]; cp+=v[i]; x[i]=1; backtrack(i+1); cw-=w[i]; cp-=v[i]; x[i]=0; } if(bound(i+1)>bestp){
backtrack(i+1); } } int bound(int i) {
int leftw= c-cw; int b = cp; while(i<=n && w[i]<=leftw) {
leftw-=w[i]; b+=v[i]; i++; } if(i<=n) b+=v[i]*leftw/w[i]; return b; } int main() {
int i; scanf("%d %d",&c,&n); for(i=1;i<=n;i++){
scanf("%d",&w[i]); } for(i=1;i<=n;i++){
scanf("%d",&v[i]); } backtrack(1); printf("%d\n",bestp); for(i=1;i<=n;i++) {
cout<<put[i]<<" "; } return 0; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177203.html原文链接:https://javaforall.net
