首页 > 其他分享 >[刷题笔记] Luogu P1853 投资的最大效益

[刷题笔记] Luogu P1853 投资的最大效益

时间:2023-08-02 21:11:18浏览次数:43  
标签:纪念品 int Luogu 一年 ans P1853 include 本题 刷题

Problem

Solution

刚开始看这道题的时候不自主的想到了纪念品,但其实本题和纪念品还是有区别的。

  • 纪念品规定了每次只能买一个纪念品,而本题可以买无限个
  • 纪念品需要在原本的基础上买进卖出,钱有进有出,而本题时只有进,稳赚不赔。

本题和纪念品不同的第一点决定了它时完全背包,纪念品是01背包变形。第二点则决定了本题只需要记录最大利息即可,ans初始设置为初始的钱数,每年结束加上最大利息即可。

此外就是个完全背包板子。具体转化如下:

  • 把需投资的钱比作重量
  • 把利息比作价值

重量每年结束需要更替,替换成原来的金额+上一年的利息。

显然前一年如何不影响后一年的最优解,满足无后效性。以及每一年都可以视作独立的,显然最优方案是将前一年的股票全都出售利滚利投资下一年。符合dp

本题重点需要考虑如何设计状态以及读懂题意,明确与纪念品一题的区别。看出是完全背包,明确每一年互不干扰,由于稳赚不赔的特性最优解显然是每一年投资的全部取出来投资下一年,利滚利。

处理的时候包括动态的ans这里借鉴了纪念品一题。

本题还可以在处理下标的时候优化,避免下标过大。由于投资额都是1000的整数,故在处理的过程中都/1000不影响答案。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 101000
#define INF 0x3f3f3f3f
using namespace std;
int s,n,d;
int ans = 0;
int w[N],v[N];
int f[N];
int main()
{
	scanf("%d%d%d",&s,&n,&d);
	ans = s;
	for(int i=1;i<=d;i++) scanf("%d%d",&w[i],&v[i]);
	for(int k=1;k<=n;k++)
	{
		memset(f,0,sizeof(f));
		for(int i=1;i<=d;i++) 
		{
			for(int j = w[i]/1000;j <= ans/1000;j++) 
			{
				f[j] = max(f[j],f[j-w[i]/1000]+v[i]);
			}
		}
		ans += f[ans/1000];
		}
		
	cout<<ans<<endl;
	return 0;
}

标签:纪念品,int,Luogu,一年,ans,P1853,include,本题,刷题
From: https://www.cnblogs.com/SXqwq/p/17601752.html

相关文章

  • [刷题笔记] Luogu P5662 [CSP-J2019] 纪念品
    ProblemDescription类似于炒股票,有买进有卖出,当天可以既买进又卖出无限次,现在有若干件物品,每件物品都有一个价格,每天每件物品的价格不一致,你初始有\(m\)元钱,想要通过若干次购进卖出的操作,使得\(T\)天后你手里的钱最多。要求:\(T\)天结束你手中的股票必须全部售出。Solution乍看......
  • [刷题笔记] Luogu P1466 [USACO2.2] 集合 Subset Sums
    ProblemDescription有一个长度为\(n\)的数组为\(1-n\),求有多少种选择方案使得选择数之和等于序列和的一半Solution题面翻译成这样是不是就好做了?首先,序列和的一半我们可以计算出\(n\times(n+1)\div2\div2\),显然序列和的一半只有是整数才有解,如果不是整数直接输出0即可。......
  • 【题解】Luogu[P2296] [NOIP2014 提高组] 寻找道路
    Link很简单的一道图论题。要在一个有向图上找一条\(s\)到\(t\)的最短路,要求这条路径上的所有点都满足:该点的所有出边所连点都能到达终点\(t\)。看上去很乱,我们简单分解一下,先在所有点中找到与终点有路径的点集\(A\)进行标记,再再所有点中找到其所有出边所连点都被打上标......
  • [刷题笔记] Luogu P2340 [USACO03FALL] Cow Exhibition G
    ProblemSolution乍看可能没有思路。我们注意到本题是牵扯到一头奶牛选or不选的问题,非常自然地想到01背包。接下来我们就尝试将本题背景转换成01背包问题。我们可以将智商转换成容量,情商转换成价值。(当然反过来也可)然后就可以套用01背包板子了:\[f_{i,j}=min(f_{i-1,j},f_{i-1......
  • 【金九银十面试冲刺】Android开发面试指南(简历、投递、刷题、复盘)
    前言无论是社招还是校招中,应聘者总是要经过层层的考核才能被聘用。然而,在招聘时,设置的编程以及非技术面试问题,真的有必要吗?如此就能考核出一位开发者的真实水平?说到底就是考验你的技术以及态度。态度大于一切。但我这里的态度分为两种。业务态度和沟通态度。面试官正是笔试这一关来......
  • [刷题笔记] Luogu P1877 音量调节
    ProblemDescription共\(n\)次操作,每次操作有一个值\(a_i\),同时给定一个初始值\(start\),对于每次操作,可以将值\(k\)加或减\(a_i\)(\(k\)初始=\(start\)),求经过这\(n\)操作后\(k\)的最大值。Solution其实这是一个01背包的变形。这和01背包有何关系呢?回顾一下经典01背包:有......
  • 【题解】Luogu[P2420] 让我们异或吧
    Link看到是树,又多组询问,立马想到类似的求和问题,异或不好理解,我们想求和怎么做,维护\(dis_i\)表示\(i\)节点到根的权值和,那么对于\(u,v\)两点路径上的权值和就是\(dis_u+dis_v-2\timesdis_{\mathrm{lca}(u,v)}\),这是很经典的问题了。事实上刚才的求和我们可以转化一下,我们......
  • 链表双指针技巧汇总 [labuladong-刷题打卡 day1]
    双指针合并21.合并两个有序链表比较简单的双指针比较算法,两个指针分别指向待合并链表/序列,比较后选择符合条件的指针移动Trick:链表在实现时,带头节点的链表在操作中更方便题解/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNo......
  • [并查集] 题单刷题摘要
    题单1.P6121[USACO16OPEN]ClosingtheFarmGP3144[USACO16OPEN]ClosingtheFarmS(逊版)思路\(\scr{Solution}\)每一时刻关闭农场,求是否全联通。也就是维护将单个集合分成多个集合。很容易想到爆搜算法,用vector邻接表建图,每次跑完图就将当前点的连边关系删去。复杂度......
  • 暑假刷题记 B
    动态规划字符串杂题A:AnimalsandPuzzleB:VanyaandTreasure根号分治。实际上是从\((1,1)\)先找一个\(1\),再找一个\(2\dots\)最后找一个\(p\)然后依次按最短路走过去。我们有两种想法,直接BFS递推得到当前点到所有点的距离或者直接暴力枚举两个层之间的所有......