取得アルゴリズム・ノート(6):バックパックDP

アルゴリズムエントリーノート:バックパックDP

//01背包
void ZeroOnePack(int v, int w, int m) {				//v为当前物品的容量  m为给定最大的容量  w为当前物品的价值

	for (int i = m; i >= v; i--) {
		dp[i] = max(dp[i], dp[i - v] + w);
	}
}

//完全背包 
void CompletePack(int v, int w, int m) {			//v为当前物品的容量  m为给定最大的容量  w为当前物品的价值
	for (int i = v; i <= m; i++) {
		dp[i] = max(dp[i], dp[i - v] + w);
	}
}

//多重背包
void MultiPack(int v, int w, int m, int c) {		//v为当前物品的容量  m为给定的最大容量  w为当前物品的价值  c为剩余物品的数量
	if (v * c >= m) {
		CompletePack(v, w, m);
	}
	else {
		int k = 1;
		while (k < c) {
			ZeroOnePack(k * v, k * w, m);
			c -= k;
			k <<=1;
		}
		ZeroOnePack(c * v, c * w, m);
	}
}
公開された10元の記事 ウォンの賞賛0 ビュー165

おすすめ

転載: blog.csdn.net/qq_40458767/article/details/104800226