方法一、暴力地将多重背包变为01背包
因为暂时没有学会一些好的优化算法,所以这里用暴力的方法解决多重背包问题,因为在这里多重背包与01背包的区别只是:多重背包每个物品可以有有限多件,而01背包每个物品只有一件,因此我们可以用一个for循环将其每件统计为一种形式,这样就把它化简为01背包问题。
#include<bits/stdc++.h>
using namespace std;
int num, WEIGHT;
int w[1001], m[1001], s[1001];
//分别为重量,价值,个数
int new_num;
//更新后的总行数
int new_w[1001], new_m[1001];
//更新之后的重量,价值
int F[1001];
void intput();
void new_input();
void initial();
void Knapsack();
int main(){
cout<<"输入共有多少个物品:";
cin>> num ;
cout<<"输入背包总容量是多少:";
cin>> WEIGHT;
cout<<endl;
intput();
new_num=0;
for(int i=1; i<=num; i++)
{
new_num= new_num+s[i];
}//计算现在有多少行
new_input();
initial();
Knapsack();
}
void intput(){
w[0]=0, m[0]=0;
for(int i=1; i<=num; i++){
cout<<"请输入第"<<i<<"种的重量:" ;
cin>> w[i];
cout<<"请输入第"<<i<<"种的价值:" ;
cin>> m[i];
cout<<"请输入第"<<i<<"种的个数:" ;
cin>> s[i];
}
cout<<endl;
}//输入每件物品的价值和重量
void new_input(){
int k=1;
for(int i=1; i<=num; i++){
for(int j=s[i]; j>0; j--){
new_w[k]= w[i];
new_m[k]= m[i];
k++;
}
}
}//更新新的每个位置的重量和价值,将其简化为01背包
void initial(){
for(int j=0; j<=WEIGHT; j++)
F[j]=0;
}//设置第零行全是零的初值
void Knapsack(){
int i,j;
for(i=1; i<=new_num; i++){
for(j=WEIGHT; j>=new_w[i]; j--){
if(j<new_w[i])
F[j]=F[j];
else
F[j]=max(F[j-new_w[i]]+new_m[i],F[j]);
if(i==new_num&&j==WEIGHT)
cout<<endl<<"所以背包的最大装载价值是:"<<F[j];
}
}
}//背包算法的主体内容