testfor1


私信TA

用户名:dotcpp0660482

访问量:165

签 名:

你麻麻的,打比赛撕了蒜了

等  级
排  名 3757
经  验 1849
参赛次数 0
文章发表 10
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

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

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

参考代码:

#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 人评分

  评论区

  • «
  • »