传送门: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. C-数据结构-typedef的用法

    .typedef的用法 # include <stdio.h> typedef int zhang; //为数据类为int从新取名为zhang 等价于int typedef struct ...

  2. L2-027. 名人堂与代金券

    链接:名人堂与代金券 在比赛中这题只得了2分,赛后发现原来strcmp函数并不是只返回-1,0,1三种,而是返回正数负数0 但是在我的电脑上一般就是返回前三种,只是用后面的三种更稳妥点 都怪我基础不扎 ...

  3. 关于RESTful 的概念

    1.REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露.URI 的设计只要负责把资源通过合理方式暴露出来就可以了.对资源的操作与它无关,操作是通过 HTTP动词来体现,所以RES ...

  4. java面对对象(六)--内部类、匿名内部类

    内部类 可以在一个类的内部定义另一个类这种类成为内部类或嵌套类,比如: class Outer{ … class Inner{ …. } } class Outer1{} // 这个Inner1不是O ...

  5. TCP系列11—重传—1、TCP重传概述

    在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接.可靠.字节流式.前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传. 很多网络 ...

  6. ACL访问控制

    /etc/squid/squid.conf 定义语法: acl aclname  acltype   string acl  aclname  acltype   "file" s ...

  7. hive web界面管理

    老版本使用 访问<Hive Server Address>:9999/hwi 1.首先下载对应版本的src文件,本机使用apache-hive-1.2.2-src.tar.gz 2.解压缩 ...

  8. charles代理以及关于其抓取https信息的操作

    一直没有写一篇关于charles的文章来记录,但是发现偶尔还是会忘记,所以还是记一下,查起来比较方便. 首先在安装了charles之后默认的本地代理地址是 127.0.0.1:8888这个地址.如果希 ...

  9. Jenkins之常用变量

    BUILD_NUMBER 目前的编号,如“153” JOB_NAME 此构建项目的名称,如“foo”或“foo / bar”. JOB_BASE_NAME 此建立项目的名称将剥离文件夹路径,例如“ba ...

  10. filebeat 配置文件参数

      filebeat 配置 所有的 beats 组件在 output 方面的配置都是一致的,之前章节已经介绍过.这里只介绍 filebeat 在 input 段的配置,如下: filebeat: sp ...