#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
const int N=101;
int dp[N][N];
int main()
{
int a,b,n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)//01背包--二维数组
{
cin>>a>>b;
for(int j=0;j<=m;j++)
{
dp[i][j]=max(dp[i-1][j-a]+b,dp[i-1][j]);
}
}
printf("%d\n",dp[n][m]);
for(int i=1;i<=n;i++)//01背包--一维数组
{
cin>>a>>b;
for(int j=m;j>=a;j--)
{
dp[j]=max(dp[j-a]+b,dp[j]);
}
}
for(int i=1;i<=n;i++)//完全背包
{
cin>>a>>b;
for(int j=0;j<=m;j++)
{
for(int k=0;k<=m/a;k++)
dp[i][j]=max(dp[i][j],dp[i-1][j-k*a]+k*b);
}
}
for(int i=1;i<=n;i++)//完全背包
{
cin>>a>>b;
for(int j=m;j>=a;j--)
{
for(int k=0;k<=m/a;k++)
dp[j]=max(dp[j],dp[j-k*a]+k*b);
}
}//多重背包
int dp[1001];
int main(void){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int a,b,c;
cin>>a>>b>>c;
for(int j=m;j>=a;j--){
for(int k=0;k<=c;k++){
if(k*a<=j)
dp[j]=max(dp[j],dp[j-a*k]+b*k);
}
}
}
cout<<dp[m]<<endl;
return 0;}
return 0;
}
背包问题
最新推荐文章于 2024-06-17 00:06:23 发布