动态规划——01背包问题

依然是一道来自实验报告的动态规划经典例题

初始状态为m[0][0−c]和m[0−n][0]都为0,前者表示前0个物品(也就是空物品)无论装入多大的包中总价值都为0,后者表示体积为0的背包啥价值的物品都装不进去。

当 j>=Wi 时,表明第i个物品可以装下,此时就可以选择装或者不装,装下的话m[i][j]=m[i+1][j-Wi]+Vi,不装的话m[i][j]=m[i+1][j]; 当j<Wi时,说明根本装不下第i个,所以m[i][j]=m[i+1][j]。

#include <bits/stdc++.h>
using namespace std;
int max(int a,int b){
	if(a>b)
		return a;
	else
		return b;	
}
int main()
{
	int m[100][100]={0},v[100],w[100],n,c;
	int bag[100];	//	最优解 
	cin>>n;
	v[0]=0;
	for(int i=1;i<=n;i++)
		cin>>v[i];	//第i个物品的价值 
	w[0]=0;
	for(int i=1;i<=n;i++)
		cin>>w[i];	//第i个物品的重量
	cin>>c;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=c;j++){
			if(j<w[i]){
				m[i][j]=m[i-1][j];
			}
			else{
				m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
			}
		}
	}	 
	cout<<"最优值:"<<m[n][c]<<endl;
    return 0;
}

该算法的时间复杂度为O(cn);