zoukankan      html  css  js  c++  java
  • 背包问题

    背包问题

    参考:

    动态规划解决01背包问题

    三种基本背包问题

    示例:

    背包问题详解:01背包、完全背包、多重背包

    三种背包问题(01背包、完全背包、多重背包)

    01背包

    有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

    二维数组:

    伪代码:

    示例代码:

    #include <vector>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    int max_value(int C, const vector<int> &W, const vector<int> &V) {
    	vector<int> dp(C + 1, 0);
    
    	for (int i = 0; i < W.size(); i++)
    		for (int j = C; j >= W[i]; j--)
    			dp[j] = max(dp[j], dp[j - W[i]] + V[i]);
    
    	return dp[C];
    }
    
    int main() {
    	/* test1 */
    	//int C = 8;  // capacity, max_value=10
    	//vector<int> W{ 2,3,4,5 };  // weight
    	//vector<int> V{ 3,4,5,6 };  // value
    
    	/* test2 */
    	//int C = 10;  // capacity, max_value=13
    	//vector<int> W{ 2,3,5,5 };  // weight
    	//vector<int> V{ 2,4,3,7 };  // value
    
    	/* test3 */
    	int C = 11;  // capacity, max_value=40
    	vector<int> W{ 1,2,5,6,7 };  // weight
    	vector<int> V{ 1,6,18,22,28 };  // value
    
    	int m = max_value(C, W, V);
    	cout << "max_value: " << m << endl;
    }
    

    多重背包

    示例代码:

    #include <vector>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    int max_value(int C, const vector<int> &W, const vector<int> &V, const vector<int> &N) {
    	vector<int> dp(C + 1, 0);
    
    	for (int i = 0; i < W.size(); i++)
    		for (int j = C; j >= W[i]; j--)
    			for (int k = 1; k <= N[i]; k++)
    				if (j >= k*W[i])
    					dp[j] = max(dp[j], dp[j - k*W[i]] + k*V[i]);
    
    	return dp[C];
    }
    
    int main() {
    	/* test1 */
    	int C = 10;  // capacity, max_value=13
    	vector<int> W{ 10,3,4,5 };  // weight
    	vector<int> V{ 3,4,6,7 };  // value
    	vector<int> N{ 5,1,2,1 };  // number
    
    	/* test2 */
    	//int C = 8;  // capacity, max_value=64
    	//vector<int> W{ 2,2,1 };  // weight
    	//vector<int> V{ 20,10,6 };  // value
    	//vector<int> N{ 2,5,10 };  // number
    
    
    	int m = max_value(C, W, V, N);
    	cout << "max_value: " << m << endl;
    }
    

    完全背包

    #include <vector>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    int max_value(int C, const vector<int> &W, const vector<int> &V) {
    	vector<int> dp(C + 1, 0);
    
    	for (int i = 0; i < W.size(); i++)
    		for (int j = W[i]; j <= C; j++)
    				dp[j] = max(dp[j], dp[j - W[i]] + V[i]);
    
    	return dp[C];
    }
    
    int main() {
    	/* test1 */
    	//int C = 10;  // capacity, max_value=12
    	//vector<int> W{ 7,4,3,2 };  // weight
    	//vector<int> V{ 9,5,3,1 };  // value
    
    	/* test2 */
    	int C = 10;  // capacity, max_value=14
    	vector<int> W{ 10,3,4,5 };  // weight
    	vector<int> V{ 3,4,6,7 };  // value
    
    
    	int m = max_value(C, W, V);
    	cout << "max_value: " << m << endl;
    }
    
  • 相关阅读:
    Spark SQL join的三种实现方式
    BitMap算法
    mysql索引建立原则
    Java常用容器对比
    如何正确的停止一个线程
    读书笔记——凤凰架构
    Linux command 整理
    禁足期间,好好学习,好好休息
    Oracle SQL Update
    Shell 知识总结
  • 原文地址:https://www.cnblogs.com/jmliao/p/12629587.html
Copyright © 2011-2022 走看看