动态规划——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 ...
随机推荐
- ASP的Global.asa使用说明
/*-------------------ASP文档参考集-----------------------*/ *-->作者:草履虫 *-->时间:2007-4.28---2007-4.30 ...
- 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...
- [bzoj1552\bzoj2506][Cqoi2014]robotic sort 排序机械臂_非旋转Treap
robotic sort 排序机械臂 bzoj-1552 bzoj-2506 Cqoi-2014 题目大意:给定一个序列,让你从1到n,每次将[1,p[i]]这段区间反转,p[i]表示整个物品权值第i ...
- [React Native] Target both iPhone and iPad with React Native
By default, React Native only targets iPhone - so if you run on an iPad, it will show up as a scaled ...
- Delicious Apples (hdu 5303 贪心+枚举)
Delicious Apples Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- JSTL函数标签
tld 文件代码 <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="ht ...
- POJ1151 Atlantis 扫描线算法
题目大意 给出几个矩形对角端点坐标,求这些矩形整体覆盖的面积. 扫描线算法 整个平面被每个矩形的水平边所在直线(以后简称“水平线”)分成了几个部分,而整体覆盖面积则为每相邻的两个水平线间夹的长度(以后 ...
- oc14--匿名对象
// // main.m // 匿名对象 #import <Foundation/Foundation.h> #import "Person.h" #import &q ...
- sql server drop login failed
https://stackoverflow.com/questions/37275/sql-query-for-logins https://www.mssqltips.com/sqlserverti ...
- 「Canvas」玩转
作者: 糖少 简介 Canvas是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可 ...