解题思路:无限==有限,资源是无穷的,背包是有限的

注意事项:就是多重背包问题

参考代码:

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=5000;//随需要而定
int n,m;
int w[N],v[N],c[N];
int dp[N][N];
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++)cin>>w[i]>>v[i]>>c[i];//输入值
for(int i=1;i<=n;i++)if(c[i]==0){
    c[i]=m/w[i];//遍历一遍,找到无穷的,求能装下的最大值,这样就是多重背包问题了
}
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=c[i]&&k*w[i]<=j;k++)//数量+占有空间比较
{
        dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+v[i]*k);//与上一步的结果进行比较k与k+1等
}
cout<<dp[n][m];//到最后
return 0;
}


 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答

代码解释器

  评论区