1. 程式人生 > >【動態規劃】--01揹包問題

【動態規劃】--01揹包問題

o1揹包問題:一個揹包體積為V, 現有n個物品,第i個物品體積為w[i],價值為c[i]。問在不超出揹包 容量前提下,揹包 最多能裝下多少價值的物品。

之所以叫01揹包是因為這類題都可以歸結為第i個物品 放還是不放問題。這裡用二維陣列表示(當然也可用一維)

若第i個物品放的話  f[i][v]=f[i-1][v-w[i]]+c[i](i表示第幾個物品,v表示重量)

若不放的話f[i][v]=f[i-1][v]

轉換方程:f[i][v] = max(f[i-1][v], f[i-1][v-w[i]]+c[i])

下面分別是二維和一維陣列模板

#include<bits/stdc++.h>
#define M 100000
int w[M];
int v[M];
int f[M][M];
using namespace std;
int main(){
	int t,m;
	cin>>t>>m;
	memset(f,0,sizeof(f));
	for(int i=1;i<=m;i++)
		cin>>w[i]>>v[i];
	for(int i=1;i<=m;i++)
	{
		for(int j=0;j+w[i]<=t;j++)
			f[i][j]=max(f[i-1][j],f[i-1][j+w[i]]+v[i]);
	}
	int maxs=0;
	for(int i=0;i<=t;i++)
		maxs=max(f[m][i],maxs);
	cout<<maxs<<endl;
	return 0;
} 
#include<bits/stdc++.h>
#define M 100000
int w[M];
int v[M];
int f[M];
using namespace std;
int main(){
	int W,m;
	memset(f,0,sizeof(f));
	cin>>W>>m;
	for(int i=1;i<=m;i++)
		cin>>w[i]>>v[i];
	for(int i=1;i<=m;i++)
		for(int j=W;j>=w[i];j--)
			f[j]=max(f[j],f[j-w[i]]+v[i]);
	cout<<f[W]<<endl;
	return 0;
}