WA on #2
好像很多人都遇到了这个问题
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define N 5003
using namespace std;
int n,a[N],b[N],k,r[N],w[N],id[N];
int bucket[203];
int dp[20005],pre[20005],use[20005];
int main(){
scanf("%d",&n);
for(int i=1; i<=n; ++i)
scanf("%d",&a[i]);
for(int i=1; i<=n; ++i)
scanf("%d",&b[i]);
int tot=0;
for(int i=1; i<=n; ++i)
{
int num=1;
while(num<=b[i])
{
++tot;
w[tot]=num;
r[tot]=num*a[i];
id[tot]=i;
b[i]-=num;
num*=2;
}
if(b[i]!=0){
++tot;
w[tot]=b[i];
r[tot]=b[i]*a[i];
id[tot]=i;
}
}
scanf("%d",&k);
for(int i=1; i<=k; ++i)
dp[i]=99999999;
for(int i=1; i<=tot; ++i)
for(int j=k; j>=r[i]; --j){
if(dp[j]>w[i]+dp[j-r[i]]){
dp[j]=w[i]+dp[j-r[i]];
pre[j]=j-r[i];
use[j]=i;
if(j==k){
memset(bucket,0,sizeof(bucket));
int t=k;
while(t!=0){
bucket[id[use[t]]]+=w[use[t]];
t=pre[t];
}
}
}
}
cout<<dp[k]<<endl;
for(int i=1; i<=n; ++i)
cout<<bucket[i]<<" ";
return 0;
}