UVA 624 - CD (01背包 + 打印物品)
2016-03-21 14:40
375 查看
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=565
题意很好理解,普通的01背包,dp[i - 1][j]表示在前i - 1件物品中选取若干物品放入容量为j背包所得到的最大的价值,dp[i - 1][j - w[i]] + v[i]表示前i - 1件物品中选取若干物品放入容量为j - w[i]背包所得到的最大的价值加上第i件物品的价值。这里同理,但是要记录选取的物品,觉得倒着过来就可以了。
题意很好理解,普通的01背包,dp[i - 1][j]表示在前i - 1件物品中选取若干物品放入容量为j背包所得到的最大的价值,dp[i - 1][j - w[i]] + v[i]表示前i - 1件物品中选取若干物品放入容量为j - w[i]背包所得到的最大的价值加上第i件物品的价值。这里同理,但是要记录选取的物品,觉得倒着过来就可以了。
#include <iostream> #include <cstring> #include <vector> using namespace std; const int MAXN = 130005; int dp[30][MAXN] , v[30]; vector <int> G; int main() { ios::sync_with_stdio(false); int V , n; while(cin >> V >> n) { G.clear(); for(int i = 1 ; i <= n ; i++) { cin >> v[i]; } memset(dp , 0 , sizeof(dp)); for(int i = 1 ; i <= n ; i++) { for(int j = 0 ; j <= V ; j++) { if(j < v[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j] , dp[i - 1][j - v[i]] + v[i]); } } int i = n , j = V; while(i > 0 && j > 0) { if(j < v[i]) { i--; continue; } if(dp[i][j] == dp[i - 1][j - v[i]] + v[i]) { j -= v[i]; G.push_back(v[i]); } i--; } for(int i = G.size() - 1 ; i > 0 ; i--) { cout << G[i] << " "; } cout << G[0] << " sum:"; cout << dp [V] << endl; } }
相关文章推荐
- 数据结构5-队列
- SDWebImage下载
- View被键盘挡住时实现动态滚动View
- android全屏和取消全屏 旋转屏幕
- linux ip限制的两种设置方式
- iOS事件处理---响应者链
- js中不同类型作比较的规律(布尔运算)
- Ubuntu 安装arm-linux-gcc交叉编译工具
- 登录 -- last*
- SWIFT基础语法(二)
- 【原创】k8s源码分析------第三方库etcd client分析
- iOS webview 上拉出现灰色背景
- object有哪些公用方法
- 子list中的顺序会影响list的顺序问题
- SQlite 数据库的简单操作
- framelayout中fragment的切换
- 1041. Be Unique (20)
- NSBundle 类
- Python读取目录所有文件名并保存
- Linux网络编程--epoll模型之LT触发模式和ET触发模式