#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=100;
const int maxv=1000;
int dp[maxv],n,c[maxn],w[maxn];
int main(){
// for(int i=1;i<=n;i++){
// for(int v=w[i];v<=V;v++){
// dp[i][v]=max(dp[i-1][v],dp[i-1][v-w[i]]+c[i]);
// }
// }
//可优化为:
int n,V;
scanf("%d%d",&n,&V);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
}
fill(dp,dp+V,0);
//核心:状态转移方程:
for(int i=1;i<=n;i++){
for(int v=V;v>=w[i];v--){
dp[v]=max(dp[v],dp[v-w[i]]+c[i]);
}
}
int max=-1;
for(int i=0;i<=V;i++){
if(dp[i]>max){
max=dp[i];
}
}
printf("%d\n",max);
return 0;
}
01背包问题
最新推荐文章于 2021-10-21 20:59:21 发布