传送门:Problem 1064

https://www.cnblogs.com/violet-acmer/p/9852294.html

题解:

  这道题是 “01”背包问题的变形。

  如果不考虑买附件必须买相应的主件这一条件下,这就是单纯的 “01”背包问题。

  那,这道题该如何做呢?

  注意看一下题干,每个主件最多有 2 个附件,那这就容易些了,枚举所有的可能;

  对于第 i 个主件,有以下五种可能:

  (1):不选主件 i

  (2):只选主件 i

  (3):选主件 i + 附件1

  (4):选主件 i + 附件2

  (5):选主件 i + 附件1 + 附件2

  从这五个中找到最大的价值组合,并和 dp[i-1][ j ]判断,取最大值,当然在选择附件时,需要满足当前价值可以容下所选择的总价值。

AC代码:

 #include<iostream>
#include<cstdio>
using namespace std;
#define P pair<int ,int >
const int maxn=3.2e4+; int n,m;
int dp[][maxn];
P mainG[maxn];//存储主件信息
P touchG[][maxn];//touchG[i] : 存储主件 i 含有的附件信息
int total[];//total[i] : 主件 i 含有的附件个数
int Val(P p){
return p.first*p.second;
}
void Solve()
{
for(int i=;i <= m;++i)
{
P one=touchG[i][];
P two=touchG[i][];
for(int j=;j <= n;++j)
{
dp[i][j]=dp[i-][j];
if(j >= mainG[i].first)
dp[i][j]=max(dp[i][j],dp[i-][j-mainG[i].first]+Val(mainG[i]));
if(j >= mainG[i].first+one.first)
dp[i][j]=max(dp[i][j],dp[i-][j-mainG[i].first-one.first]+Val(mainG[i])+Val(one));
if(j >= mainG[i].first+two.first)
dp[i][j]=max(dp[i][j],dp[i-][j-mainG[i].first-two.first]+Val(mainG[i])+Val(two));
if(j >= mainG[i].first+one.first+two.first)
dp[i][j]=max(dp[i][j],dp[i-][j-mainG[i].first-one.first-two.first]+Val(mainG[i])+Val(one)+Val(two));
}
}
printf("%d\n",dp[m][n]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i <= m;++i)
{
int v,p,q;
scanf("%d%d%d",&v,&p,&q);
if(!q)
mainG[i]=P(v,p);
else
touchG[q][++total[q]]=P(v,p);
}
Solve();
}

二维dp

 #include<iostream>
#include<cstdio>
using namespace std;
#define P pair<int ,int >
const int maxn=3.2e4+; int n,m;
int dp[maxn];
P mainG[maxn];//存储主件信息
P touchG[][maxn];//touchG[i] : 存储主件 i 含有的附件信息
int total[];//total[i] : 主件 i 含有的附件个数
int Val(P p){
return p.first*p.second;
}
void Solve()
{
for(int i=;i <= m;++i)
{
P one=touchG[i][];
P two=touchG[i][];
for(int j=n;mainG[i].first != && j >= ;--j)
{
if(j >= mainG[i].first)
dp[j]=max(dp[j],dp[j-mainG[i].first]+Val(mainG[i]));
if(j >= mainG[i].first+one.first)
dp[j]=max(dp[j],dp[j-mainG[i].first-one.first]+Val(mainG[i])+Val(one));
if(j >= mainG[i].first+two.first)
dp[j]=max(dp[j],dp[j-mainG[i].first-two.first]+Val(mainG[i])+Val(two));
if(j >= mainG[i].first+one.first+two.first)
dp[j]=max(dp[j],dp[j-mainG[i].first-one.first-two.first]+Val(mainG[i])+Val(one)+Val(two));
}
}
printf("%d\n",dp[n]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i <= m;++i)
{
int v,p,q;
scanf("%d%d%d",&v,&p,&q);
if(!q)
mainG[i]=P(v,p);
else
touchG[q][++total[q]]=P(v,p);
}
Solve();
}

一维dp

   关于主件编号问题(踩坑了):

      m个物品,编号为 1~m,而不是按照主件的个数进行编号。

      例如:

              (正确编号)(错误编号)

        2000 10   

        500 1 0    1    1
        400 4 0    2    
        300 5 1    3
        400 5 1    4
        200 5 0    5    
        500 4 5    6
        400 4 0    7    
        320 2 0    8    
        410 3 0    9    
        400 3 5    10

      找这个BUG找了好几个小时,mmp,心累啊.................

      

 

    

洛谷 P1064 金明的预算方案(01背包问题)的更多相关文章

  1. 洛谷P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...

  2. 洛谷 P1064 金明的预算方案【有依赖的分组背包】

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱 ...

  3. 洛谷 P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  4. 洛谷 P1064 金明的预算方案 (有依赖的0/1背包)

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...

  5. [NOIP2006] 提高组 洛谷P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  6. 洛谷 P1064 金明的预算方案(有依赖的背包问题)

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  7. 洛谷P1064 金明的预算方案(01背包)

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...

  8. Java实现 洛谷 P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元 ...

  9. 洛谷 P1064 金明的预算方案【DP/01背包-方案数】

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...

随机推荐

  1. 数组-在Shell脚本中的基本使用介绍

    Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节.下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~1. ...

  2. 如何解决jersey框架中以json格式返回数组,当数组中元素一个时json格式不对

    原文地址:http://www.cnblogs.com/swpk/p/3566536.html?utm_source=tuicool jersey 是oracle 出的一个较好的REST框架.使用此框 ...

  3. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C-Bracket Subsequence

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  4. Ubuntu14.04安装PyMuPDF

    最近写的一个东西需要将pdf转成图片然后放在网页上展示,找到了个非常好用的轮子叫做PyMuPDF,在windows上测试的时候跑的666,在ubuntu上安装依赖的时候,简直万脸懵逼.github上给 ...

  5. 个人作业Week3

    个人作业week3 一.  调研,评测 1.我的使用体验 版本:IOS版   BUG_1: 点击单词本中的“同步”后,会提示登录Microsoft账户.登录成功立即开始同步单词本.在单词本同步过程中, ...

  6. rabbitMq实现与zookeeper类似的watcher功能

    场景:A.B.C.D(可以是一个机器的不同进程,也可以是不同机器的进程)启动了相同的项目,使用同一个数据库.但是,如果A修改了数据库的数据,需要B.C.D在很短的时间能够知道数据库发生了修改.当然可以 ...

  7. [Beta]M2事后分析

    计划 你原计划的工作是否最后都做完了? 如果有没做完的,为什么? 答:没有,全部的功能没有实现.其中,界面还差两个,逻辑还差闹钟逻辑和群组逻辑,可以说这些东西是我们的核心功能之一,缺失了他们对我们整个 ...

  8. MySQL服务器监控注意事项

    当开发,测试,生产的数据库环境配置不一致(比如:配置字符集不同)时而导致特殊现象时,可以从Navicat的<工具>-<服务器监控>-<变量>里查找原因.

  9. Jmeter 常用断言使用

    响应断言 可根据要测试响应字段和模式匹配规则来设置断言,比如下方截图是匹配返回的结果中是否包含"code:200,",如果包含则表示断言成功,否则失败.响应断言可添加多个,但是多个 ...

  10. 转帖--计算机网络基础知识大总汇 https://www.jianshu.com/p/674fb7ec1e2c?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    计算机网络基础知识大总汇 龙猫小爷 关注 2016.09.14 23:01* 字数 12761 阅读 30639评论 35喜欢 720 一.什么是TCP/IP 网络和协议 1.     TCP/IP是 ...