zoukankan      html  css  js  c++  java
  • 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
    ",VV);
        }
        return 0;
    }
  • 相关阅读:
    C# 不用添加WebService引用,调用WebService方法
    贪心 & 动态规划
    trie树 讲解 (转载)
    poj 2151 Check the difficulty of problems (检查问题的难度)
    poj 2513 Colored Sticks 彩色棒
    poj1442 Black Box 栈和优先队列
    啦啦啦
    poj 1265 Area(pick定理)
    poj 2418 Hardwood Species (trie树)
    poj 1836 Alignment 排队
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3887004.html
Copyright © 2011-2022 走看看