多重背包问题

问题描述:
有N种物品和一个容量是V的背包
第i种物品最多有si件,每件体积是vi,价值是wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入:

第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有N行,每行三个整数vi,wi,si,用空格隔开,分别表示第i种物品的体积和价值和数量。

输出:

输出一个整数,表示最大价值。

当复杂度不大时,可以采用暴力解决

/*
f[i]总体积是i的情况下,最大价值是多少 
状态转移
 第一重循环循环物体
 第二重循环循环体积 
初始化问题:
1.f[i]=0;
f[m]就是答案
2.f[0]=0,f[i]=-inf,i!=0
 max(f[0......m]) */
 #include<iostream>
 #include<string>
 #include<algorithm>
 using namespace std;
 const int N=110;
 int n,m;
 int f[N];
 int main()
 {
 cin>>n>>m;
 for(int i=0;i<n;i++)
 {
     int v,w,s; //这个题是01背包问题的扩展 所以还是从大到小循环 
     cin>>v>>w>>s;
     for(int j=m;j>=0;j--)
     for(int k=1;k<=s&&k*v<=j;k++)
     f[j]=max(f[j],f[j-k*v]+k*w);
     }    
     cout<<f[m]<<endl;
     return 0;
 }
 
原文地址:https://www.cnblogs.com/hrlsm/p/12823057.html