揹包問題

01揹包:

#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 1000+10
int main() {
	//變量和數組:
	int n, m;//n爲物品個數,m爲揹包最大容量
	int dp[MAX] = { 0 };//dp[x]表示揹包容量爲x時的所裝物品的最大價值
	int w[7] = { 0 };//物品的重量
	int v[7] = { 0 };//物品的價值
	
	//賦值:
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> w[i] >> v[i];
		if (w[i] > m) {//如果物品的重量大於揹包容量,不考慮
			i--;
			n--;
		}
	}
		
	//初始化dp數組:
	//裝滿的——只有0能裝滿0,其他的初始化爲負無窮
	dp[0] = 0;
	for (int i = 1; i <= m; i++)
		dp[i] = -99999;
	//不要求裝滿——所有的初始都爲0;
	dp[MAX] = { 0 };

	//核心代碼:
	for (int i = 1; i <= n; i++)
		for (int j = m; j >= w[i]; j--)
			dp[j] = max(dp[j], dp[j - w[i]] + v[i]);//狀態轉移方程
	
	cout << dp[m];
	return 0;
}

完全揹包:

#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 1000+10

//變量和數組:
int n, m;//n爲物品個數,m爲揹包最大容量
int dp[MAX] = { 0 };//dp[x]表示揹包容量爲x時的所裝物品的最大價值
int w[7] = { 0 };//物品的重量
int v[7] = { 0 };//物品的價值

//優化函數
bool optimize(int i) {
	for (int x = i - 1; x >= 0; x--) {
		if (w[i] >= w[x]   && v[i] <= v[x])//重量大但價值小的不考慮
			return true;
	}
	return false;
}

int main() {
	//賦值:
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> w[i] >> v[i];
		if (w[i] > m || optimize(i)) {//如果物品的重量大於揹包容量,不考慮
			i--;
			n--;
		}
	}
		
	//初始化dp數組:
	//裝滿的——只有0能裝滿0,其他的初始化爲負無窮
	dp[0] = 0;
	for (int i = 1; i <= m; i++)
		dp[i] = -99999;
	//不要求裝滿——所有的初始都爲0;
	dp[MAX] = { 0 };

	//核心代碼:
	for (int i = 1; i <= n; i++)
		for (int j = w[i]; j <= m; j++)
			dp[j] = max(dp[j], dp[j - w[i]] + v[i]);//狀態轉移方程
	
	cout << dp[m];
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章