动态规划(背包问题):HRBUST 1377 金明的预算方案
金明的预算方案
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
|
主件 |
附件 |
|
电脑 |
打印机,扫描仪 |
|
书柜 |
图书 |
|
书桌 |
台灯,文具 |
|
工作椅 |
无 |
如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是10元的整数倍)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:
v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*为乘号)
请你帮助金明设计一个满足要求的购物单。
Input
有多组测试数据。
对于每组测试数据,输入的第1行,为两个正整数,用一个空格隔开:
N m
(其中N(<32000)表示总钱数,m(<60)为希望购买物品的个数。)
从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数
v p q
(其中v表示该物品的价格(v<10000),p表示该物品的重要度(1~5),q表示该物品是主件还是附件。如果q=0,表示该物品为主件,如果q>0,表示该物品为附件,q是所属主件的编号)
处理到文件结束。
Output
对于每组测试数据,输出一行,只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<200000)。
Sample Input
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
Sample Output
2200 这道题我在vijos和codevs上交可以AC的代码在HRBUST上WA,最后发现那个鬼OJ输入INT要%lld!!!从没见过啊!!!!!
坑~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=;
int cost[maxn],val[maxn],ls[maxn],rs[maxn],fa[maxn];
int t[maxn][][];
int fir[maxn],cnt;
int dp[maxn][];
int main()
{
int Money,n;
while(~scanf("%d%d",&Money,&n))
{
memset(fir,,sizeof(fir));
memset(ls,,sizeof(ls));
memset(rs,,sizeof(rs));
memset(dp,,sizeof(dp));
memset(t,,sizeof(t));cnt=; for(int i=;i<=n;i++){
scanf("%lld%lld%lld",&cost[i],&val[i],&fa[i]);//这里有争议
val[i]*=cost[i];
if(!fa[i])continue;
if(ls[fa[i]])rs[fa[i]]=i;
else ls[fa[i]]=i;
} for(int i=;i<=n;i++){
if(fa[i])continue;
++cnt;
t[cnt][++fir[cnt]][]=cost[i];
t[cnt][fir[cnt]][]=val[i];
if(!ls[i]&&!rs[i])continue;
t[cnt][++fir[cnt]][]=cost[i]+cost[ls[i]];
t[cnt][fir[cnt]][]=val[i]+val[ls[i]]; if(rs[i]){
t[cnt][++fir[cnt]][]=cost[i]+cost[rs[i]];
t[cnt][fir[cnt]][]=val[i]+val[rs[i]]; t[cnt][++fir[cnt]][]=cost[i]+cost[ls[i]]+cost[rs[i]];
t[cnt][fir[cnt]][]=val[i]+val[ls[i]]+val[rs[i]];
}
} for(int k=;k<=cnt;k++)
for(int i=Money;i>=;i--)
for(int j=;j<=fir[k];j++)
if(i>=t[k][j][])
dp[k][i]=max(max(dp[k][i],dp[k-][i-t[k][j][]]+t[k][j][]),dp[k-][i]);
else
dp[k][i]=max(dp[k][i],dp[k-][i]); printf("%d\n",dp[cnt][Money]);
}
return ;
}
动态规划(背包问题):HRBUST 1377 金明的预算方案的更多相关文章
- 【动态规划】Vijos P1313 金明的预算方案(NOIP2006提高组第二题)
题目链接: https://vijos.org/p/1313 题目大意: m(m<=32000)金钱,n(n<=60)个物品,花费vi,价值vi*ci,每个物品可能有不超过2个附件,附件没 ...
- Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)
Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...
- NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)
一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...
- 背包形动态规划 fjutoj2375 金明的预算方案
金明的预算方案 TimeLimit:1000MS MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 金明今天 ...
- 算法笔记_103:蓝桥杯练习 算法提高 金明的预算方案(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些 ...
- NOIP2006 金明的预算方案
1. 金明的预算方案 (budget.pas/c/cpp) [问题描述] 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈 ...
- 【洛谷P1064】[NOIP2006] 金明的预算方案
金明的预算方案 显然是个背包问题 把每个主件和它对应的附件放在一组,枚举每一组,有以下几种选法: 1.都不选 2.只选主件 3.一个主件+一个附件 4.一个主件+两个附件 于是就成了01背包.. #i ...
- NOIP 2006 金明的预算方案
洛谷 P1064 金明的预算方案 https://www.luogu.org/problem/P1064 JDOJ 1420: [NOIP2006]金明的预算方案 T2 https://neooj.c ...
- [codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案
[codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案 试题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴 ...
随机推荐
- oracle 字符串切割成结果集方法
oracle字符串切割几种方式 方法一: SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5')); 方法二: ...
- gulp的点点滴滴
去年用gulp,但一直没有写篇博客,今天有时间无聊写一篇.... 什么是gulp?gulp的官网title上对这个工具有一个比较准确的定义,叫做:基于流的自动化构建工具.如果你查看它的网页源代码,还会 ...
- Java-Android 之单选按钮的运用
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Axiom3D学习日记 2.介绍SceneManager,SceneNode,Entity
SceneManager(场景管理类) 所有出现在屏幕里的东西都受SceneManager管理(最好是这样),当你放置对象在场景里,SceneManager就会跟踪他们的位置,当你为场景创建一个相机, ...
- ado.net与各种orm操作数据方式的比较
ADO.NET与ORM的比较(1):ADO.NET实现CRUD http://zhoufoxcn.blog.51cto.com/792419/283952 ADO.NET与ORM的比较(2):NHib ...
- nopi导入导出
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- iOS 去除导航栏下的黑线
Swift: navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) na ...
- SSL VPN 详解
SSL VPN是专栏VPN系列技术原理的最后一篇,SSL VPN作为远程接入型的VPN,已经具备非常广阔的前景,它的主要适应场景是取代L2TP Over IPSec,但功能要比L2TP Over IP ...
- Javascript的AMD规范
Javascript发展到今天,已经从一个小丑语言变成了不可替代的前端利器,已经脱离了低端的玩笑脚步,而转变为有规可依的强大语言. 本文主要讲述下如今被大力推广的AMD规范,为什么要AMD,什么场景是 ...
- 获取C++类成员变量的地址偏移
今天有在校学生问怎么获取类中的成员变量的地址偏移量,这个应该是很多初学C++的人很好奇的问题.以前我在学校的时候,也有过这种需求.忘了当时是要写什么“奇怪的程序”了,反正需要获取一个类的成员变量的地址 ...