动态规划之01背包(1)

洛谷P1048 采药

题目描述

辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

如果你是辰辰,你能完成这个任务吗?

输入输出格式

输入格式:

输入文件medic.in的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。


输出格式:

输出文件medic.out包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

输入输出样例

输入样例#1: 复制

70 3
71 100
69 1
1 2

输出样例#1: 复制

3

说明

对于30%的数据,M <= 10;

对于全部的数据,M <= 100。

NOIP2005普及组第三题

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int tim[105];
int v[105];
int dp[105][1005]={0};
int main()
{
int t,n;
cin>>t>>n;//输入最多可用时间(即背包的大小),输入药品(物品)数量
for(int i=1;i<=n;i++)
{
cin>>tim[i]>>v[i];
}//输入物品的收集所用时间(即所占背包的空间/物品重量),输入各个物品的价值

for(int i=1;i<=n;i++)
{
for(int j=0;j<=t;j++)//注意j=0,因为dp(i,0)就是表示前i个物品剩余0体积的时候的状态
{
if(j>=tim[i])
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-tim[i]]+v[i]);
//状转方程:直到上一层的最大价值/上一层加上本层价值的和,同时背包的剩余空间减少
}
else {dp[i][j]=dp[i-1][j];}//如果剩余时间不够,那么最大价值就为直到上一层的最大价值
}
}
cout<<dp[n][t];
return 0;
}

时间: 2024-10-04 10:46:17

动态规划之01背包(1)的相关文章

动态规划之01背包详解【解题报告】

01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻. 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ? 题目描述: 有编号分别为a,b

动态规划基础-----01背包(总结)

1.动态规划(DP) 动态规划(Dynamic Programming,DP)与分治区别在于划分的子问题是有重叠的,解过程中对于重叠的部分只要求解一次,记录下结果,其他子问题直接使用即可,减少了重复计算过程.  另外,DP在求解一个问题最优解的时候,不是固定的计算合并某些子问题的解,而是根据各子问题的解的情况选择其中最优的.  动态规划求解具有以下的性质:  最优子结构性质.子问题重叠性质   最优子结构性质:最优解包含了其子问题的最优解,不是合并所有子问题的解,而是找最优的一条解线路,选择部分

动态规划之01背包

动态规划的基本思想: 将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算.通常用来求最优解,且最优解的局部也是最优的.求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解. 动态规划算法可分解成从先到后的4个步骤: 1. 描述一个最优解的结构,寻找子问题,对问题进行划分. 2. 定义状态.往往将和子问题相关的各个变量的一组取值定义为一个状态.某个状态的值就是这个子问题的解(若有k个变量,一般用K维的数组存储各个状态下的解,并可根    据这个数组记录打印求解过程.).

动态规划(0-1背包)--- 组合总和

组合总和 377. Combination Sum IV (Medium) nums = [1, 2, 3] target = 4 The possible combination ways are: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) Note that different sequences are counted as different combinations. Therefore the ou

HDU 1171 Big Event in HDU (动态规划、01背包)

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 57986    Accepted Submission(s): 19484   Problem Description Nowadays, we all know that Computer College is the biggest departme

动态规划求解0-1背包

C代码实现如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int** DP(int num, int Weight, int*w, int *v); 5 void output(int *c, int *w, int weight, int **ptr, int num); 6 int main() 7 { 8 9 10 int w[] = {3, 4, 7, 8, 9}; 11 int v[] = {4, 5, 10, 11,

采药-动态规划(01背包)

采用一维数组进行优化 #include<cstdio> #include<algorithm> using namespace std; int w[105], v[105]; int dp[1005]; int main() { int m, n; scanf("%d%d", &m, &n); for(int i=1; i<=n; i++) scanf("%d%d", &w[i], &v[i]); fo

动态规划(0-1背包)---字符串按单词列表分割

字符串按单词列表分割 139. Word Break (Medium) s = "leetcode", dict = ["leet", "code"]. Return true because "leetcode" can be segmented as "leet code". 题目描述: ??给定一个字符串和一个单词数组,判断字符串是否能被单词数组中的单词分割 思路分析: ??dict 中的单词没有使用

HDU4815 Little Tiger vs. Deep Monkey——0-1背包

题目描述 对于n道题目,每道题目有一个分值,答对加分,答错不得分,你要和一个叫深猴的比赛,题目你可以假设成判断题(不是对就是错),深猴对于所有的题目都是随机选择一个答案,而你是有脑子的,求为了不输掉比赛(平局或你获胜)的可能性至少为p时你至少需要得到多少分,有t组数据,每次输入两行,第一行为n,p(有n道题目,n<=40, 不会输的可能性为p,0.0<=p<=1.0),第二行输入n个1~1000的整数,代表这n道题分别答对能获得的分数 样例输入 1 3 0.5 1 2 3 样例输出 3