1. 程式人生 > 其它 >揹包問題(未完成)

揹包問題(未完成)

目錄

揹包問題

  • 挑東西的問題

01揹包_選與不選的問題

  • 迴圈變數從大到小,避免重複(否則將變成完全揹包)
  • f[N]表示的是在N的資源下達成的結果,這裡的N的資源並不是處在all in的狀態,而是可以允許閒置的狀態。
  • 當前的狀態從何而來?一般是消耗一定的資源來換取一定的成果。
  • 有些題目存在開啟條件,如278. 數字組合,所有的數字起源都來自於0,要令f[0]=1,從而通過f[0]=1來初始化其他的數字

1024.裝箱問題

有一個箱子容量為 V,同時有 n 個物品,每個物品有一個體積(正整數)。

要求 n 個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。

  • 儘可能拉大體積
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int V;
	int n;
	cin>>V>>n;
	int f[V+1],v;
	memset(f,0,sizeof(f));
	for(int i=1;i<=n;i++)
	{
		cin>>v;
		for(int j=V;j>=v;j--)
		{
			f[j]=max(f[j],f[j-v]+v);
		}
	}
	cout<<V-f[V];
	return 0;
}

278. 數字組合

給定 N個正整數 A1,A2,…,AN,從中選出若干個數,使它們的和為 M,求有多少種選擇方案。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int f[m+1];
	memset(f,0,sizeof(f));
	f[0]=1;
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		for(int j=m;j>=x;j--)
		    f[j]=f[j]+f[j-x];
	}
	cout<<f[m];
	return 0;
}

完全揹包_選多和選少的問題

二維費用的揹包問題_站在01揹包的肩上

  • f[狀態型別1]變成f[狀態型別1][狀態型別2]

8. 二維費用的揹包問題

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int main()
{
	int N,VOL,WEI;
	cin>>N>>VOL>>WEI;
	int vol,wei,val;
	int f[VOL+1][WEI+1];
	memset(f,0,sizeof(f));
	for(int i=0;i<N;i++)
	{
		cin>>vol>>wei>>val;
		for(int j=VOL;j>=vol;j--)
		    for(int k=WEI;k>=wei;k--)
		    {
		    	f[j][k]=max(f[j][k],f[j-vol][k-wei]+val);
			}
	}
	cout<<f[VOL][WEI]<<endl;	
	return 0;
}