poj2063 Investment
http://poj.org/problem?id=2063
首先总结一下:总的来说通过这题我深深感觉到了自己的不足,比赛时思维很受限,。。。面对超时,没有想到好的解决方案。
题意:给出初始资金,还有年数,然后给出每个物品的购买价格与每年获得的利益,要求在给出的年份后所能得到的最大本利之和。
思路:因为每种物品可以多次购买,可以看做是完全背包的题目,但是要注意的是,由于本金可能会很大,所以我们要对背包的大小进行压缩,(否则超时超内存)值得注意的是,题目已经说了本金与物品的购买价格都是1000的倍数,所以我们可以将他们都除以1000来进行压缩,然后就是一道完全背包模板题了。
解决方案:完全背包问题,因为每种股票可以无限投资,而问n年之后的最大收益,我们将每一年的最大收益计算,将前i-1年的现有收益作为现在投资金额再次对第i年进行投资。
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int dp[1000001]; int main() { int T,V,time,d,VV;//V是背包的容积,w[i]是物品的体积 int w[12],v[12]; scanf("%d",&T); while(T--) { scanf("%d%d",&V,&time); scanf("%d",&d); VV=V; for(int i=1;i<=d;i++) { scanf("%d%d",&w[i],&v[i]); w[i]=w[i]/1000;//因为证券都是1000的倍数 } for(int i=1;i<=time;i++) { V=VV/1000;//因为证券都是1000的倍数,钱数不满整千绝对不能买,所以完全可以/1000 for(int j=0;j<=V;j++) dp[j]=0; for(int j=1;j<=d;j++) { for(int k=w[j];k<=V;k++) { if(dp[k]<dp[k-w[j]]+v[j]) { dp[k]=dp[k-w[j]]+v[j]; } } } VV=VV+dp[V];//钱数累加 } printf("%d\n",VV); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构