Codevs1155 金明的预算方案 ——2006年NOIP全国联赛提高组 变种经典背包dp
来源:互联网 发布:域名注册使用godaddy 编辑:程序博客网 时间:2024/06/05 04:46
Codevs1155 金明的预算方案 ——2006年NOIP全国联赛提高组
由于至多有2个附件,直接手动枚举就好了。
dp时:
- 如果当前物品是附件, 跳过
- 如果当前物品时主件
- 只选这个主件,不选它的附件
- 当这个主件有附件时, 选它和它的第一个主件
- 当这个主件有2个附件时, 选它和它的第二个主件
- 当这个主件有2个附件时, 选它和它的所有附件
#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>#include <vector>using namespace std;#define MAXN (60+6)#define MAXV (32000+32)struct item{ int v, p, q;}l[MAXN];int dp[MAXV];vector <int> q[MAXN];int main(){ int V, n; cin >> V >> n; for(int i = 1; i <= n; i ++) { scanf("%d%d%d", &l[i].v, &l[i].p, &l[i].q); if(l[i].q) q[l[i].q].push_back(i); } for(int i = 1; i <= n; i ++) { if(l[i].q) continue; for(int j = V; j >= 0; j --) { // 只选主件 if(j >= l[i].v) dp[j] = max(dp[j], dp[j - l[i].v] + l[i].v*l[i].p); //只选第一件 if(q[i].size() && j >= l[i].v + l[q[i][0]].v) dp[j] = max(dp[j], dp[j - (l[i].v + l[q[i][0]].v)] + l[i].v*l[i].p + l[q[i][0]].v*l[q[i][0]].p); //只选第二件 if(q[i].size() > 1 && j >= l[i].v + l[q[i][1]].v) dp[j] = max(dp[j], dp[j - (l[i].v + l[q[i][1]].v)] + l[i].v*l[i].p + l[q[i][1]].v*l[q[i][1]].p); //全选 if(q[i].size() > 1 && j >= l[i].v + l[q[i][0]].v + l[q[i][1]].v) dp[j] = max(dp[j], dp[j - (l[i].v + l[q[i][0]].v + l[q[i][1]].v)] + l[i].v*l[i].p + l[q[i][0]].v*l[q[i][0]].p + l[q[i][1]].v*l[q[i][1]].p); } } cout << dp[V]; return 0;}
另:(精简不了多少……)
#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>#include <vector>using namespace std;#define MAXN (60+6)#define MAXV (32000+32)int dp[MAXV];struct item{ int v, p, q;}l[MAXN];vector <int> q[MAXN];int main(){ int V, n; cin >> V >> n; for(int i = 1; i <= n; i ++) { scanf("%d%d%d", &l[i].v, &l[i].p, &l[i].q); if(l[i].q) q[l[i].q].push_back(i); } for(int i = 1; i <= n; i ++) { if(l[i].q) continue; //如果是附件 for(int j = V; j >= 0; j --) { int lson, rson; if(q[i].size()) lson = q[i][0];// 假设附件为 儿子 if(q[i].size() > 1) rson = q[i][1]; //只选主件 if(j >= l[i].v) dp[j] = max(dp[j], dp[j-l[i].v] + l[i].v*l[i].p); //选主件和第一个附件 if(q[i].size() > 0 && j >= l[i].v + l[lson].v) dp[j] = max(dp[j], dp[j - (l[i].v + l[lson].v)] + l[i].v*l[i].p + l[lson].v*l[lson].p); //选主件和第二个附件 if(q[i].size() > 1 && j >= l[i].v + l[rson].v) dp[j] = max(dp[j], dp[j - (l[i].v + l[rson].v)] + l[i].v*l[i].p + l[rson].v*l[rson].p); //全选 if(q[i].size() > 1 && j >= l[i].v + l[lson].v + l[rson].v) dp[j] = max(dp[j], dp[j - (l[i].v + l[lson].v + l[rson].v)] + l[i].v*l[i].p + l[lson].v*l[lson].p + l[rson].v*l[rson].p); } } cout << dp[V]; return 0;}
1 0
- Codevs1155 金明的预算方案 ——2006年NOIP全国联赛提高组 变种经典背包dp
- 树形依赖背包(codevs1155 金明的预算方案 2006年NOIP全国联赛提高组)
- Code Vs 1155 金明的预算方案&& 2006年NOIP全国联赛提高组
- 金明的预算方案 2006年NOIP全国联赛提高组
- 金明的预算方案2006年NOIP全国联赛提高组
- Codevs1115 开心的金明 ——2006年NOIP全国联赛普及组 普通背包dp
- 【日常学习】【背包DP】codevs1155 金明的预算方案题解
- 2006年分区联赛提高组之二 金明的预算方案(dp)
- Codevs1154 能量项链 ——2006年NOIP全国联赛提高组 区间dp
- SDNU 1179.金明的预算方案【NOIP 2006 提高组】【背包问题】【7月30】
- NOIP提高组2006 金明的预算方案
- JZOJ1483、JZOJsenior1179.【NOIP提高组】金明的预算方案
- 聪明的质监员 2011年NOIP全国联赛提高组
- 能量项链 2006年NOIP全国联赛提高组
- P1064 金明的预算方案【2006提高】(背包)
- 【动态规划】Vijos P1313 金明的预算方案(NOIP提高组2006第二题)
- NOIP 2006 提高组 复赛 budget 金明的预算方案
- NOIP 2006 - 提高组 金明的预算 动态规划(DP)
- MDK Keil编译器编译窗口的设置
- 设计模式六大原则 - (3):依赖倒置原则
- cocos2d-js
- mysql通过“延迟关联”进行limit分页查询优化的一个实例
- Nodejs创建https服务器(Windows 7)
- Codevs1155 金明的预算方案 ——2006年NOIP全国联赛提高组 变种经典背包dp
- HOG 学习
- 自定义Editext控制输入字数限制的文本框Editext
- boosting和adaboost区别
- jQuery笔记--动画篇
- 设计模式六大原则 - (4):接口隔离原则
- Android二維碼掃描
- spring mvc 通过bean获取form的参数和并且进行服务器验证 ,而且支持多个文件上传的用法。html使用form_data
- Struts2为什么无法找到action啊?eclipse和myeclipse不一样吗?