NYOJ 49 开心的小明
开心的小明
- 描述
-
小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行”。今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元。于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N 元(可以等于N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。设第j 件物品的价格为v[j],重要度为w[j],共选中了k 件物品,编号依次为j1...jk,则所求的总和为:v[j1]*w[j1]+..+v[jk]*w[jk]请你帮助金明设计一个满足要求的购物单.
- 输入
-
第一行输入一个整数N(0<N<=101)表示测试数据组数
每组测试数据输入的第1 行,为两个正整数,用一个空格隔开:
N m
(其中N(<30000)表示总钱数,m(<25)为希望购买物品的个数。)
从第2 行到第m+1 行,第j 行给出了编号为j-1
的物品的基本数据,每行有2 个非负整数
v p
(其中v 表示该物品的价格(v≤10000),p 表示该物品的重要度(1~5)) - 输出
-
每组测试数据输出只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的
最大值(<100000000) - 样例输入
-
1 1000 5 800 2 400 5 300 5 400 3 200 2
- 样例输出
-
3900
-
背包问题也是动态规划问题!
-
解题思路:
-
首先为了简化问题,我们把1000,800 ··· 200简化为10,8 ··· 2 !
-
第一步:初始化10个背包
-
dp[0]=0:表示可能会出现的价格为0的状态,初始值为0
-
dp[1]=0:表示可能会出现的价格为1的状态,初始值为0
-
dp[2]=0:表示可能会出现的价格为2的状态,初始值为0
-
dp[3]=0:表示可能会出现的价格为3的状态,初始值为0
-
dp[4]=0:表示可能会出现的价格为4的状态,初始值为0
-
dp[5]=0:表示可能会出现的价格为5的状态,初始值为0
-
dp[6]=0:表示可能会出现的价格为6的状态,初始值为0
-
dp[7]=0:表示可能会出现的价格为7的状态,初始值为0
-
dp[8]=0:表示可能会出现的价格为8的状态,初始值为0
-
dp[9]=0:表示可能会出现的价格为9的状态,初始值为0
-
dp[10]=0:表示可能会出现的价格为10的状态,初始值为0
-
第二步:分析给出的每组数据
-
第一组:8 2;假如说把价格为8重要程度为2的物品装进背包,那么此时背包会出现哪几种状态呢?很明显,可能会出现背包从dp[0]转移到dp[8],dp[1]转移到dp[9],dp[2]转移到dp[10]这三个状态;那么dp[8],dp[9],dp[10]这三个状态是保留还是舍去呢?此时肯定要比较在这个状态转移之前和状态转移之后,我们更想要哪个状态?所以需要写成dp[10]=Max(dp[10],dp[10-8]+2*8);dp[10]表示状态转移之前的状态,dp[10-8]+2*8表示状态转移之后的状态!同样,有dp[9]=Max(dp[9],dp[9-8]+2*8);dp[8]=Max(dp[8],dp[8-8]+2*8);
-
第二组:4 5;有上述可列出:dp[10]=Max(dp[10],dp[10-4]+4*5); dp[9]=Max(dp[9],dp[9-4]+4*5); ··· ;dp[4]=Max(dp[4],dp[4-4]+4*5);
-
依次类推······
-
最后dp[10]的值即为要求得的结果!
-
AC码:
-
#include<stdio.h> #include<string.h> struct node {int v;int p; }num[25]; int max(int x,int y) {return x>y?x:y; } int main() {int N;int dp[30003];scanf("%d",&N);while(N--){int n,m,i,j;scanf("%d%d",&n,&m);memset(dp,0,sizeof(dp));for(i=0;i<m;i++){scanf("%d%d",&num[i].v,&num[i].p);}for(i=0;i<m;i++){for(j=n;j>=num[i].v;j--)dp[j]=max(dp[j-num[i].v]+num[i].v*num[i].p,dp[j]);}printf("%d\n",dp[n]);}return 0; }
NYOJ 49 开心的小明相关推荐
- NYOJ 49 开心的小明
点击打开链接 很多题都可以通过转化,转化为我们比较熟悉的模型,比如说这个题,我们就可以转化为0-1背包处理.把n当作背包容积,m当作物品个数,v当作每种物品的体积,p*v当作每种物品的价值,这样,求物 ...
- NYOJ-49 开心的小明
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...
- 【动态规划】开心的小明
[动态规划]开心的小明 贵有恒,何必三更起五更眠:最无益,莫过一日曝十日寒. [动态规划]开心的小明 时间限制: 1 Sec 内存限制: 128 MB 提交: 20 解决: 10 [提交][状态] ...
- 开心的小明 (NYOJ49) [动态规划.01背包]
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...
- 开心的小明-动态规划算法
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...
- 开心的小明(ACM)
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...
- C++编程题,开心的小明
小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行&quo ...
- NYOJ 52 无聊的小明
无聊的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 这天小明十分无聊,没有事做,但不甘于无聊的小明聪明的想到一个解决无聊的办法,因为他突然对数的正整数次幂产生了兴 ...
- NYOJ 擅长排列的小明 II---Problem B
擅长排列的小明 II 时间限制:1000 ms | 内存限制:65535 KB 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5 ...
最新文章
- 当前路径_[JSP] 07 JSP 路径问题
- 华为创造出5g和鸿蒙,拥有5G专利,开发鸿蒙系统:《华为智慧》复盘成长路总结成功之道...
- 全国大学生智能汽车竞赛浙江赛区选拔赛疫情防控工作预案
- delphi之http通讯
- WEB初学者简介,web入门
- 《转》python学习--基础上
- 经典论文复现 | 基于深度卷积网络的图像超分辨率算法
- css设置不允许复制文本内容
- Codeforces Round #587 (Div. 3) C. White Sheet 思维
- 一张图带你了解JRE、JDK、JVM
- 【Shell】数某关键字在文件中出现次数
- 严重BS骗样本的骗子
- windows截图快捷方式
- 计算机毕业设计基于Python实现的药店|药房管理系统
- A00工具类学习之参考文献写法
- 两个路由器无线连接教程
- OpenJudgeNOI4978 宠物小精灵之收服
- 过滤器(Filter)的实现方式
- php tp6 错误接管分析,终于成功使用whoops接管tp6的异常处理!
- 讲一点有技术含量的东西(一)
热门文章
- 第五章 运输层(UDP和TCP三次握手,四次挥手分析)
- 虚拟机配置自定义静态ip,并能访问外网
- rsync的原理——转载
- NYOJ-99 单词拼接(欧拉+回溯)
- 通过php extension使disable_function支持通配符
- 以cisco 3550为例介绍IOS的恢复方法:
- why is pc important for university students?
- what should you do if you can be silent and do things
- In English or Chinese?
- life at University of Liverpool