首页 > 其他分享 >P1048 [NOIP2005 普及组] 采药 题解

P1048 [NOIP2005 普及组] 采药 题解

时间:2025-01-21 20:04:37浏览次数:3  
标签:NOIP2005 背包 int 题解 ra max 物品 P1048 dp


原题链接

题目大意:

采药,每种药只有一株,每株有它的价值和采它所需的时间,现时间有限,请你输出在有限时间内能获得的价值最大是多少。

分析:

1.这是一个典型的01背包问题(DP)

01背包问题的典型特征:

有一个限定容量的背包(对应本题中的时间),有物品(每种只有一个)(对应本题中的药株),物品有体积(对应本题中采集所需的时间)与价值,问最大能获得多少价值?

二维DP:

设第i个物品的重量为w[i],价值为v[i],背包总容量为W

设dp数组,dp[i][j]为只能放前i个物品且背包容量为j的情况下所能获得的最大价值

转移:假设当前已经处理好了前i-1个物品的所有状态,那么对于第i个物品

有 不放入背包:背包剩余容量不变,背包中物体的总价值不变,所一这种情况的最大价值为

dp[i-1][j];

放入背包:背包剩余容量减小w[i],背包中物品的总价值会增大v[i],所以这种情况的最大价值为

dp[i-1][j-w[i]]+v[i].

由此得状态转移方程:

        dp[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])

此题数据规模小,用二维dp可以过

AC代码:

#include<iostream>
#include<cstdio>
using namespace std;
int v[1005],w[1005],n,m,dp[105][1005];
int main(){
	cin>>m>>n;//m代表t,n代表m(题中的)
	for(int i=1;i<=n;i++){
		scanf("%d%d",&v[i],&w[i]);
	} 
	for(int i=1;i<=n;i++){
		for(int j=0;j<=m;j++){
			dp[i][j]=dp[i-1][j];
			if(j>=v[i]){//还有时间才行
				dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
			}
		}
	}
	cout<<dp[n][m];
	return 0;
}

但是二维dp通常会爆MLE,所以我们要优化空间复杂度

dp[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])

(设第i个物品的重量为w[i],价值为v[i],背包总容量为W

设dp数组,dp[i][j]为只能放前i个物品且背包容量为j的情况下所能获得的最大价值)

考虑使用滚动数组优化

由于对dp[i]有影响的只有dp[i-1],可以去掉第一维,直接用dp[i]来表示处理到当前物品时背包容量为

i的最大价值,得

        f[j]=max(f[j],f[j-w[i]]+v[i])

新代码:

#include<iostream>
using namespace std;
int t,m;
struct node{
	int ti,w;
}ra[102];
int dp[1005];
int main(){
	cin>>t>>m;
	for(int i=1;i<=m;i++){
		cin>>ra[i].ti>>ra[i].w;
	}
	int add=0;
	for(int i=1;i<=m;i++){
		for(int j=t;j>=0;j--){
			if(j>=ra[i].ti)
			dp[j]=max(dp[j],dp[j-ra[i].ti]+ra[i].w);
		}
	}
	cout<<dp[t];
	return 0;
} 

 

标签:NOIP2005,背包,int,题解,ra,max,物品,P1048,dp
From: https://blog.csdn.net/ghhvhgvugft/article/details/145288527

相关文章

  • 洛谷P1002 [NOIP2002 普及组] 过河卒 题解
    原题链接题目大意:棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:向下或向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。棋盘用坐标表示,AA点(0,0)、BB点(n,m),同样马的位置坐标是需要给出的。现在要求你计算出......
  • 2025牛客寒假算法基础集训营1 ptlks的题解
    A.茕茕孑立之影题意:给定序列,找出一个数x,满足x和数组中任意一个元素都互不为倍数关系思路x范围为1e18以内,序列元素范围为1e9以内,选大于1e9的质数即可,特判序列中有1的情况。代码点击查看代码voidsolve(){ intn; cin>>n; intf=1; for(inti=1;i<=n;i++){ cin>>a[......
  • 题解:洛谷 P4879 ycz的妹子
    题目https://www.luogu.com.cn/problem/P4879感觉还比较简单的线段树。首先我们先建立一棵线段树(范围:)。voidbuild(intk,intl,intr){ tr[k]={l,r}; if(l==r){ Tree[k]=a[l],c[k]=(l<=n); return; } intmid=(l+r)>>1ll; build(k<<1ll,l,mid); build((k<<1ll)|1l......
  • 题解:洛谷 P1351 [NOIP2014 提高组] 联合权值
    题目https://www.luogu.com.cn/problem/P1351我们可以发现,若点对  的距离为 ,则它们一定会经过一个中转点,因此我们考虑枚举中转点 ,然后枚举与  有直接边连接的两个点,按照题意统计答案即可。#include<bits/stdc++.h>usingnamespacestd;#pragmaG++optimisze(3,"Ofas......
  • 【题解】Luogu P4340 [SHOI2016] 随机序列
    简单手摸后发现,答案就是这么一个式子:\[(3^{n-1}-3^{n-2})a_1+(3^{n-2}-3^{n-3})a_1a_2+\dots+(3^1-3^0)a_1a_2\dotsa_{n-1}+a_1a_2\dotsa_n\]啊当然证明也是好证的,对于\(a_1\)这一项,它后面放+或-都会对系数加一,而放*不会影响系数,因此系数就是总数的三分之二。其它前缀......
  • 题解:P3823 [NOI2017] 蚯蚓排队
    题目链接https://www.luogu.com.cn/problem/P3823分析先解决队伍的合并与分离问题。使用链表结构,分别维护每只蚯蚓的前驱和后继即可。然后考虑如何统计答案。可以对每只蚯蚓的“向后\(k\)数字串”使用字符串哈希的方式获得哈希值,再用一个哈希表存储每个哈希值出现的次数。对......
  • 2024 (ICPC) Jiangxi Provincial Contest I 题 Neuvillette Circling题解
    简单思路一个圆套中了几个点,如果不断缩小这个圆,那么最终的结果有两种有两个点卡住了这个圆,且这两点一定是直径有三个或者三个以上的点卡住了这个圆,圆心在这三个点围成的三角形的外接圆圆心。因此我们枚举两点作为直径,或者枚举三个点作为圆的内接三角形,求这个三角形的外接圆......
  • 2024 (ICPC) Jiangxi Provincial Contest L 题 Campus 题解
    简单思路首先对于所有的出口求一遍最短路,由于出口只会打开并关闭一次,所以大门的开启状态是相当有限的(最多大概30种),我们对于每一种状态直接暴力求答案最后输出即可。复杂度大概\(O(knlogn)\)参考代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;type......
  • Codeforces Round 998 (Div. 3) 部分题解
    写题解的时候这场在评测,就不放代码了。E.GraphComposition题意给两个无向简单图,对图\(1\)添加若干条边或删除若干条边,使得两图的连通性一致,最少需要变更多少条边。题解求出图\(2\)的连通性,考虑图\(1\)的所有边,若违背了图\(2\)联通性的要删除(图\(2\)不联通但图\(......
  • 20250120 T2 simu题解
    简单模拟(simu)【题目描述】给定$a_1,a_2,\ldots,a_n$和$b_1,b_2,\ldots,b_n$。对于所有整数$x\in[l,r]$,模拟以下过程并求出变量$res$的最终的值。res=0fori=1ton:ifx>=a[i]:x=x-a[i]res=res+b[i]【输入格式】......