• 背包问题


    背包问题

    参考:

    动态规划解决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;
    }
    
  • 相关阅读:
    jvm的方法栈在干什么
    时间段交集查询
    linux 设置静态ip配置
    elk 学习
    内网穿透 https:natapp.cn
    mysql当前时间,日期转换,日期格式化
    swaggerui api.docs
    linux java -jar 后台进程
    druid 数据源 sql控制台输出
    spring pointcut 表达式
  • 原文地址:https://www.cnblogs.com/jmliao/p/12629587.html
Copyright © 2020-2023  润新知