• POJ 2063 Investment


    思路:

    因为每年存款的利息不变,所以第二年的本金是第一年的本息和,以此类推

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<set>
    #include<vector>
    #include<map>
    #include<algorithm>
    #include<cmath>
    #include<stdlib.h>
    using namespace std;
    #define inf 10000000
    int p[20],can[20],d,dp[50000];
    int getmax(int begin)//本金
    {
        int i,j;
        memset(dp,0,sizeof(dp));
        for(i=0;i<d;i++)    //对每一种存款方式  进行完全背包操作
        {
            for(j=p[i];j<=begin;j++)
            dp[j]=max(dp[j],dp[j-p[i]]+can[i]);
        }
        return dp[begin];   //返回最大的可得利息
    }
    int main()
    {
        int t,mon,year,sum,i,j,leave,tmp;
        cin>>t;
        while(t--)
        {
            cin>>mon>>year>>d;// mon 一开始的本金, year 存的年数, d    存款方式种类数
            leave=mon%1000;   // leave 存的是本金里不能用的钱,也就是小于1000的部分
            mon/=1000;
            tmp=mon;
            for(i=0;i<d;i++){
             cin>>p[i]>>can[i];
             p[i]/=1000;
            }               //因为存款方式中The value of a bond is always a multiple of $1 000,所以除以1000,减少背包的容量
            for(i=1;i<=year;i++)
            {
                sum=getmax(tmp);// sum 用来存改年可得利息
                tmp=sum;    
                mon=leave+mon*1000+tmp;// 更新本金   
                leave=mon%1000;        //更新不能用的钱
                mon/=1000;         
                tmp=mon;               //下一年的本金
            }
            cout<<mon*1000+leave<<endl;
        }
    }
    
  • 相关阅读:
    求数组中最大子数组的和(二维环)
    《梦断代码》读书笔记 第3篇
    求数组中最大子数组的和(1000)
    求数组中最大子数组的和(环)
    电梯调度1
    求数组中最大子数组的和(二维)
    读书笔记之反思篇
    二维数组求最大子数组
    结对开发~环形数组篇
    结对开发 ~挑战来了
  • 原文地址:https://www.cnblogs.com/ainixu1314/p/3843392.html
Copyright © 2020-2023  润新知