Bootstrap

多重背包问题(c++)

方法一、暴力地将多重背包变为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];
		}
	}
}//背包算法的主体内容 

;