POJ 2063 完全背包

Sample Input

1
10000 4
2
4000 400
3000 250

Sample Output

14050

题意: 给你本金 m 和年限 n ,以及 d 种债券(购买一年后就可以卖出)的花费及收益(卖出后的净利润)   在 d 种债券中不限制地购买(如果钱够) 问 n 年后的最大收益(含本金)

m <= 1000000n <= 40d <= 10

题目中给出了两个关键的信息 : 债券的花费是1000的倍数,利率不超过10%因为花费是1000的倍数,所以可以将dp的复杂度降低1000倍,数组空间同样会压缩1000倍,避免了TIE。1.1^40 ≈ 45.3 所以开 45300 的数组就够了。


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 5e4+5;
int w[15],v[15];
int dp[maxn];

int main(){
    int t, m, n, d;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&m,&n,&d);
        int sum = m;
        m /= 1000;
        for(int i=0;i<d;i++)
            scanf("%d%d",&v[i],&w[i]),v[i]/=1000;
        for(int k=0;k<n;k++){
            memset(dp,0,sizeof(dp[0])*(m+5));
            for(int i=0;i<d;i++){
                for(int j=v[i];j<=m;j++)
                    dp[j] = max(dp[j],dp[j-v[i]]+w[i]);
            }
            sum += dp[m];
            m = sum/1000;
        }
        printf("%d\n",sum);
    }
    return 0;
}#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 5e4+5;
int w[15],v[15];
int dp[maxn];

int main(){
    int t, m, n, d;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&m,&n,&d);
        int sum = m;
        m /= 1000;
        for(int i=0;i<d;i++)
            scanf("%d%d",&v[i],&w[i]),v[i]/=1000;
        for(int k=0;k<n;k++){
            memset(dp,0,sizeof(dp[0])*(m+5));
            for(int i=0;i<d;i++){
                for(int j=v[i];j<=m;j++)
                    dp[j] = max(dp[j],dp[j-v[i]]+w[i]);
            }
            sum += dp[m];
            m = sum/1000;
        }
        printf("%d\n",sum);
    }
    return 0;
}

 
 

原文地址:https://www.cnblogs.com/kongbb/p/10938184.html

时间: 2024-10-10 08:43:11

POJ 2063 完全背包的相关文章

poj 2063 基础完全背包

这是一题基础的完全背包,适合初学者来理解完全背包 题意:有 n 种债券可以买 ,  每种债券的价格为 w , 每一年的收益为 p , 给你 wi 块钱 , 和 years 年的时间 , 我们最大的收益是是多少? 因为 , 每种债券可以买任意多个 , 所以这是一个简单的完全背包,但是由于基数(体积)太大 , 所以需要优化一下 : 由题意我们知道 , 每种债券的价格都是 1000 的倍数 , 那么我们就让每种债券的价格都 除以 1000 , 并且把 p 也除以 1000 , 这样就MTE , 也不会

POJ 2063 Investment (完全背包)

A - Investment Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2063 Description John never knew he had a grand-uncle, until he received the notary's letter. He learned that his late grand-uncle

POJ 2063 Investment

POJ 2063 Investment 完全背包 fakeDescription: 吃土魔法少女经济不景气辣! 变出借来了为1000的倍数的钱打算去投资股票辣! (顺便吃土少女说她最多只能借来1000000元)告诉你吃土少女将会吃土投资几年以及每种股票的年收益和每一股的价格 现在吃土少女任命你为投资顾问制定每年的投资方案最大化收益.吃土少女不关心你怎么买的.只需要你写个程序告诉她她最后持有多少财富.吃土少女等着你来拯救! 以上题目描述都是我口胡的.233.不过意思对了就行了233 由于每年有一次

POJ 1384 Piggy-Bank 背包DP

所谓的完全背包,就是说物品没有限制数量的. 怎么起个这么intimidating(吓人)的名字? 其实和一般01背包没多少区别,不过数量可以无穷大,那么就可以利用一个物品累加到总容量结尾就可以了. 本题要求装满的,故此增加个限制就可以了. #include <stdio.h> #include <stdlib.h> #include <string.h> inline int min(int a, int b) { return a < b? a : b; } c

poj 2184 0---1背包的变形

这题是0--1背包的变形,对理解0--1背包有很大的帮组 题意:要选一些牛去参见展览,每个牛有幽默.智慧两个选择标准,要求选的这些牛使得幽默和智慧的总和最大且幽默和智慧的每个总和都必须是大于等于0: 刚看的这个题目是时候,知道是一个0--1背包的的题目,但就是不知道怎么来写出状态转移方程,因为题中的两个变量都是有负值的. 看了大牛的解题报告才知道. 我们可以把幽默个变量看成是体积 , 智慧看成是价值. 我们可以把每个牛幽默的值 , 放在一个坐标上,让后整体往右移,使得最小值为 0 , 那么这时候

POJ 1014 Dividing 背包

这道题使用多重背包,不过其实我也不太明白为什么叫这个名字. 因为感觉不是什么多重,而是物体的分解问题. 就是比如一个物体有数量限制,比如是13,那么就需要把这个物体分解为1, 2, 4, 6 如果这个物体有数量为25,那么就分解为1, 2, 4, 8, 10 看出规律吗,就是分成2的倍数加上位数,比如6 = 13 - 1 - 2 - 4, 10 = 25 - 1 - 2 - 4 - 8,呵呵,为什么这么分解? 因为这样分解之后就可以组合成所有1到13的数,为25的时候可以组合成所有1到25的数啦

poj 1837 01背包

Balance Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Gigel has a strange "balance" and he wants to poise it. Actually, the device is different fr

POJ 3624 01背包

初学DP,用贪心的思想想解题,可是想了一个多小时还是想不出. //在max中的两个参数f[k], 和f[k-weight[i]]+value[i]都是表示在背包容量为k时的最大价值 //f[k]是这个意思,就不用说了. //而f[k-weight[i]]+value[i]也表示背包容量为k时的最大价值是为什么呢? //首先,f[k-weight[i]]表示的是背包容量为k-weight[i]的容量,也就是说f[k-weight[i]] //表示的是容量还差weiht[i]才到k的价值,+walu

Charlie&#39;s Change POJ - 1787 (完全背包+记录路径)

完全背包输出路径:对于每一次更新记录一下路径:注意钱币个数: dp[i][0]代表在空间为i时需要多少枚钱币 dp[i][1]用来记录路径 cheek[j]用来记录在j时用了多少i枚钱币 思路在代码中: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define mem(a,b) memset(a,b,sizeof