HUST 1354 - Rubiks (DP)
1354 - Rubiks
时间限制:1秒 内存限制:64兆
- 题目描述
-
Isun is a genius. Not only he is an expert in algorithm, but also he plays damn-good in many funny games. Besides, he can recover a Rubik in 16 seconds or even less. The man is very crazy about Rubiks, and he has bought a lot of Rubiks. As we know, there are
so many kinds of Rubiks in the world. Isun wants to buy the most valuable ones with his limited money. There are N kinds of Rubiks in all. Each of them has a price Pi(1<=i<=N) RMB and a value Vi(1<=i<=N). Isun will
pay no more than M (RMB) in total. In addition, there are some Rubik families like “甲X” or “封X”. And a kind of Rubik belongs to one family at most. If Isun buys a group of them, the value of them as a family will increase. Can you get the largest value of
the Rubiks that Isun can get with M (RMB). (Isun just buy one Rubik each kind at most) - 输入
-
The input contains several test cases and is ended by EOF. Each test case begins with two integers: N (1<=N<=1000) and M (1<=M<=10000). The second line contains N integers representing the prices of the Rubiks. (1<=Pi<=10000) The third line contains N integers
representing the value of the Rubiks. (1<=Vi<=10000) Then a line contains an integer G(0<=G<=15) representing the number of the Rubik families. Next G lines each with a start of an integer Si(1<=Si<=N) representing the number of Rubiks in the ith family. The
following Si integers represent Rubik’s id (which start from 1 to N). And an integer Yi at the end means the value increased if you buy them all.(1<=Yi<=10000) - 输出
- There should be one line per test case containing the largest value.
- 样例输入
-
4 10
4 5 3 6
1 2 100 200
1
2 1 2 330 - 样例输出
-
333
-
动态规划
-
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#include <stdio.h> using namespace std;
int v[1020];
int w[1020];
int v2[20];
int w2[20];
int dp[10005];
int bp[10005];
int tag[1005];
int b[20][1005];
int n,m;
int g;
int s[20],sv;
int a;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
scanf("%d",&g);
memset(tag,0,sizeof(tag));
for(int i=1;i<=g;i++)
{
scanf("%d",&s[i]);
int value=0;int weight=0;
for(int j=1;j<=s[i];j++)
{
scanf("%d",&b[i][j]);
tag[b[i][j]]=i;
value+=v[b[i][j]];
weight+=w[b[i][j]];
}
scanf("%d",&a);
value+=a;
w2[i]=weight;
v2[i]=value;
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
if(!tag[i])
{
for(int j=m;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
for(int i=1;i<=g;i++)
{
memcpy(bp, dp, sizeof(dp));
for(int j=m;j>=w2[i];j--)
bp[j]=max(bp[j],bp[j-w2[i]]+v2[i]);
for(int k=1;k<=s[i];k++)
{
for(int j=m;j>=w[b[i][k]];j--)
dp[j]=max(dp[j],dp[j-w[b[i][k]]]+v[b[i][k]]);
}
for(int j=1;j<=m;j++)
dp[j]=max(dp[j],bp[j]); }
printf("%d\n",dp[m]);
}
return 0;
}
HUST 1354 - Rubiks (DP)的更多相关文章
- HUST 1354 Rubiks
背包.注释写详细了. 本想这样写:每个组内各自做背包,然后组间做背包,但是由于这题M=10000,时间复杂度太大. #include<cstdio> #include<cstring ...
- 51nod 1354【DP】
(我一定是A了一题假DP) 给定序列a[0],a[1],a[2],...,a[n-1] 和一个整数K时, 有多少子序列所有元素乘起来恰好等于K. K<=1e8; 思路: 感觉 k 的 约数是突破 ...
- 1354 选数字 DP背包 + 数学剪枝
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1354&judgeId=187448 其实这题和在若干个数字中,选 ...
- HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)
传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少 ...
- HUST 4681 String (DP LCS变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题目大意:给定三个字符串A,B,C 求最长的串D,要求(1)D是A的字序列 (2)D是B的子序列 ...
- UVA1625Color Lenth(DP+LCS变形 未AC)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/C 紫书P276 res[i][j]表示第一个序列移动i个,第 ...
- HDU 4113 Construct the Great Wall(插头dp)
好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...
- DP(Dynamic programming)——尽力学习之中(2016 HUAS ACM 暑假集训-5)
这周不打算按照以往的方式更新博客,而是采用整体的方式.一是因为学的太少,没东西写:二是这篇博客会经常更新的.如题,DP——尽力学习之中. ------------------------------- ...
- hdu1520 树形dp Anniversary party
A - Anniversary party Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
随机推荐
- ionic关于隐藏底部tabs终极解决方案
网上看到很多都是写个指令,监听view进出对tab进行显示隐藏,试过挺多个,自己写了一个,都不是太让人满意,问题大多数为: 1.二级页面是隐藏了tab,但是进去三级视图发现tab又出来了 2.三级,四 ...
- EazyUI主页框架搭建纯JS样例
採用Jfinal+EazyUI 执行起来就好能够了 眼下还未增加后台代码 纯JS代码搭建的一个二级菜单+主页 客户换肤, 给使用EazyUI的新人一个高速可用的JS 搭建界面 也给自己保存下 界面 ...
- Linux——CentOS 6.3下PostgreSQL 的安装与配置
一.简介 PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统.有些特性甚至连商业数据库 都不具备.这个起源于伯 ...
- c++解释--百度百科
c++ C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛:C++支持多种编程范式 --面向对象编程.泛型编程和过程化编程.最新正式标准C++于2014年8月18日公布.[1] 其编程领域 ...
- 命名空间System.Configuration中不存在类型或命名空间名称ConfigurationManager
C#连接数据库时.这是个非经常见的错误,我刚開始就直接using System.Configuration;还是没能解决,真相是要手动加入这个程序集的引用,在项目右键加入引用选择System.Conf ...
- windowns 查看端口占用
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...
- Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc
Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc 1. 俩个问题::识别垃圾文件与清理策略1 1.1. 文件类型:pic,doc,v,m cc,isho pose ...
- 分享我们必须知道的高速GTX技术
eSATA接口只有几根线为什么那么快?连上网线显示的1Gbps是不是很令人兴奋!没错他们都用了高速GTX技术,GTX全称为Gigabit Transceiver,是为了满足现代数字处理技术和计算技术庞 ...
- 345. Reverse Vowels of a String【easy】
345. Reverse Vowels of a String[easy] Write a function that takes a string as input and reverse only ...
- std::vector
Vector Vectors are sequence containers representing arrays that can change in size. Just like arrays ...