#include <iostream>
using namespace std;
const int N=1e4+9;
using ll=long long;
ll dp[N][2];//对于魔法可以开一个维度表示是否使用魔法
int main()
{
//总共有三种选择:
// ->不选择
//选择
// -> 使用魔法
// ->不使用魔法
int n,m,k;cin>>n>>m>>k;
for(int i=1;i<=n;i++)//物品个数
{
int w,v;cin>>w>>v;
for(int j=m;j>=0;j--)//开始状态转移
{
if(j>=w)
{//没有使用
dp[j][0]=max(dp[j][0],dp[j-w][0]+v);//没使用过背包并且这次不使用
dp[j][1]=max(dp[j][1],dp[j-w][1]+v);//使用过背包并且这次不使用
}
if(j>=w+k)
{
dp[j][1]=max(dp[j][1],dp[j-w-k][0]+v*2);//没使用过背包并且这次使用
}
}
}
cout<<max(dp[m][1],dp[m][0]);//m体积时最大价
return 0;
}
2223 背包与魔法
最新推荐文章于 2025-12-20 17:21:30 发布

527

被折叠的 条评论
为什么被折叠?



