C++ 动态规划-背包类例题
来源:互联网 发布:linux screen 切换 编辑:程序博客网 时间:2024/05/18 10:30
(一)01背包变形
例1:分西瓜
已知有一堆西瓜,请帮忙将这一堆西瓜分成两堆,已知每个西瓜的重量,现在要求分成两堆的西瓜的重量的差最小
输入描述
第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
输出描述
输出分成两堆后的质量差
样例输入
55 8 13 27 14
样例输出
此题好想的方法是:可以转化为01背包问题:假设总重是V,求背包容量为V/2的最大价值,这里价值就是重量
【解法1】
#include <iostream>using namespace std;int n, V, hfV;int v[50001], c[50001];int f[50001];int main() {cin >> n;for(int i=1; i<=n; i++) cin >> v[i];for(int i=1; i<=n; i++) {V += v[i];c[i] = v[i];}hfV = V/2;for(int i=1; i<=n; i++) for(int j=hfV; j>=v[i]; j--)f[j] = max(f[j], f[j-v[i]] + c[i]);if(V % 2 == 0) cout << (hfV - f[hfV]) * 2 << endl;else cout << V - 2 * f[hfV] << endl;return 0;}
#include <iostream>using namespace std;int n, V, hfV;int v[50001];bool f[50001];int main() {cin >> n;for(int i=1; i<=n; i++) cin >> v[i];for(int i=1; i<=n; i++) V += v[i];hfV = V/2;f[0] = 1;for(int i=1; i<=n; i++)for(int j=hfV; j>=v[i]; j--)f[j] = f[j] || f[j-v[i]];int maxv = 0; for(int i=hfV; i>=1; i--)if(f[i]) {maxv = i;break;}if(V % 2 == 0) cout << (hfV - maxv) * 2 << endl;else cout << V - 2 * maxv << endl;return 0;}
这一题是01背包的经典变形:满箱背包
阅读全文
0 0
- C++ 动态规划-背包类例题
- 动态规划背包类型例题-饭卡
- 动态规划经典例题
- 动态规划例题
- 动态规划典型例题
- C++ 动态规划-背包类
- 动态规划 01背包 c算法
- 动态规划算法以及例题
- 动态规划的典型例题
- ACM 动态规划例题详解
- 动态规划入门级例题
- 动态规划 背包问题
- 蓝桥杯 动态规划+背包
- 【动态规划】背包问题
- 动态规划 01背包
- 动态规划-背包问题
- 动态规划+背包问题
- 动态规划-背包问题
- React多组件嵌套
- P1616 疯狂的采药,完全背包问题
- 使用Map对于两层for循环的一个优化
- 模拟log4j获取日志对象调用所在的类名、方法名及行号
- 知识体系
- C++ 动态规划-背包类例题
- POJ1001 Exponentiation
- LeetCode 414 Third Maximum Number(set + priority_queue)
- Intellij IDEA 全面教程
- getline()详解
- 如何解决问题“This Class is not Key Value Coding-Compliant for the Key”
- 去水印--《On the Effectiveness of Visible Watermarks》
- Opencv3.0+vs2015
- redash添加elasticsearch数据源