动态规划——Buyer
题目链接
题目描述
哆啦A梦班级举办个party,当然吃的东西必不可少,哆啦A梦负责采购任务,他得到了一份清单,上面注明不同食品的受欢迎程度,哆啦A梦需要用一定的价钱尽可能达到的更大的受欢迎程度!例如,瓜子的受欢迎程度为20,瓜子的价钱是50元,那么如果哆啦A梦选择买瓜子,将花费50元,但受欢迎程度增加了20。为了避免食品单调性,每种食品只能买一份,不能重复购买。 现在哆啦A梦需要知道如何采购才能达到最大的受欢迎程度,你能帮助他吗?
输入
输入数据为多组,每组输入的第一行有两个正整数M和N(M<100&&N<1000),分别为哆啦A梦可以支配的钱数和清单上的可选择的物品种类。 接下来的N行每行有两个正整数,分别为每种物品的价钱和它的受欢迎程度(编号为1到N)。
输出
如果存在物品购买,那么输出的第一行为能够达到的最大的受欢迎程度。第二行为需要购买的物品的编号(如果有多种可能,输出字典序靠前的那种),空格分隔每个数字;如没有物品可以购买,输出只有一行,为数字0。
样例输入
10 4
100 5
5 5
5 5
10 10
样例输出
10
2 3 这道题可以使用动态规划:
w[i]:第i件物品的价格
v[i]:第i件物品的欢迎程度
a[i][j]:在第i件物品时,剩余金钱j,得到的在大欢迎程度
我们每次选择都是买i,或不买i
买i物品:a[i][j]=a[i-1][j-w[i]]+v[i];
不买i物品:a[i][j]=a[i-1][j];
我们还需要考虑的是当前的剩余的金钱是否够买i物品
代码:
for(int i=;i<=n;i++)
{
for(int j=;j<=s;j++)
{
//a[i-1][j-w[i]]+v[i]是将i物品装入背包
//a[i-1][j]是不装
if((j-w[i])>=)
{
if(a[i-][j]>=(a[i-][j-w[i]]+v[i]))
{
a[i][j]=a[i-][j];
}
else
{
a[i][j]=a[i-][j-w[i]]+v[i];
}
}
else
{
a[i][j]=a[i-][j];
} }
}
完整代码
#include<bits/stdc++.h>
using namespace std; int main()
{
int s,n;
while(cin>>s>>n)
{
int a[][]={};
int w[]={},v[]={};
int c[]={};
int k=;
for(int i=;i<=n;i++)
{
cin>>w[i]>>v[i];
}
for(int i=;i<=n;i++)
{
for(int j=;j<=s;j++)
{
//a[i-1][j-w[i]]+v[i]是将i物品装入背包
//a[i-1][j]是不装
if((j-w[i])>=)
{
if(a[i-][j]>=(a[i-][j-w[i]]+v[i]))
{
a[i][j]=a[i-][j];
}
else
{
a[i][j]=a[i-][j-w[i]]+v[i];
}
}
else
{
a[i][j]=a[i-][j];
} }
}
if(a[n][s]!=)
{
printf("%d\n",a[n][s]);
for(int i=n,j=s;i>=&&j>=;)
{
if(a[i][j]>a[i-][j])
{
c[k]=i;
k++;
j-=w[i];
i--; }
else
{
i--;
}
}
for(int i=;i>=;i--)
{
if(c[i]>)
{
if(i!=)
printf("%d ",c[i]);
else
printf("%d\n",c[i]);
} }
}
else
{
printf("0\n");
} } return ;
}
动态规划——Buyer的更多相关文章
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
- POJ 1163 The Triangle(简单动态规划)
http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
随机推荐
- js setTimeout函数
最近在看JS DOM编程艺术,在第十章的动画里面有个setTimeout函数的例子中涉及了很多的引号,研究了好大一会才看明白,综合网上各个大神的解释和自己的理解,其原理是这样的: 首先看下程序源代码: ...
- mongodb--reduce并行处理框架
reduce 命令 db.runCommand( { mapReduce: <collection>, map: <function>, reduce: <functio ...
- COGS——C610. 数对的个数
http://cogs.pro/cogs/problem/problem.php?pid=610 Description出题是一件痛苦的事情!题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B P ...
- js 判断 wifi and 流量
var connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection || { ...
- 【SQLSERVER】MD5注意事项
sql中使用MD5加密是很常见的事情,但是不知道注意点的人还是会即便是拷贝网络上的写法也是会出现错误的. 举个例子简单说明: 由上图我们可以发现相同的字符串但是得到的MD5加密的字符却是不相同的,那么 ...
- nginx源代码分析--进程间通信机制 & 同步机制
Nginx源代码分析-进程间通信机制 从nginx的进程模型能够知道.master进程和worker进程须要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号, ...
- Java封装FushionCharts
近期公司接了个关于数据统计的系统.须要用到报表功能.找了几天认为还是FushionCharts 适合.所以就对FushionCharts进行了java代码封装,方便,前台,后台调用. 1.报表Mode ...
- luogu2508 [HAOI2008]圆上的整点
题目大意 给出\(r\),求圆\(x^2+y^2=r^2\)上坐标均为整数的点数.\(n<=2,000,000,000\) 总体思路 我们看到这个数据大小,还是个数学题,想到这个的时间复杂度应当 ...
- 【SDOI 2010】 古代猪文
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1951 [算法] 欧拉定理+中国剩余定理 + lucas定理 [代码] #includ ...
- javascript必须知道的知识要点(一)
该文章不详细叙述各知识要点的具体内容,仅把要点列出来,供大家学习的时候参照,或者检测自己是否熟练掌握了javascript,清楚各个部分的内容. 语句 注释 输出 字面量 变量 数据类型 typeof ...