poj 2063 基础完全背包

这是一题基础的完全背包,适合初学者来理解完全背包

题意:有 n 种债券可以买 ,  每种债券的价格为 w , 每一年的收益为 p , 给你 wi 块钱 , 和 years 年的时间 , 我们最大的收益是是多少?

因为 , 每种债券可以买任意多个 , 所以这是一个简单的完全背包,但是由于基数(体积)太大 , 所以需要优化一下 :

由题意我们知道 , 每种债券的价格都是 1000 的倍数 , 那么我们就让每种债券的价格都 除以 1000 , 并且把 p 也除以 1000 , 这样就MTE , 也不会超时了。

完全背包和0---1背包

完全背包的每种物品是可以任意取多个 , 因此时间复杂为:O(VN(v/w1+v/w2........+v/wn)), 如果以这样的时间复杂度去A这题,那么就会超时。

优化:

完全背包每次可以取任意多个物品 , 因此我们这样看,当我们要去 n 物品时 , 让其和取 n-1 个物品时的状态,进行状态转移,也就是我们在状态转移时,我们从小到大进行转移。具体看下面代码。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

#define maxn 45011
long long w , d;
long long wi[300] , pi[300];
long long n ;
long long dp[maxn];

int main()
{
    int t;

    scanf("%d" , &t);
    while(t--)
    {
        cin>>w>>d;
        long long x , y , z;
        long long i , j;
        long long k = 1;
        long long sum = w;
        memset(dp , 0 , sizeof(dp));
        cin>>n;
        for(i = 1; i <= n; i++)
        {
            cin>>wi[i]>>pi[i];
            wi[i] /= 1000;
        }
        y = 0;
        for(z = 0; z < d; z++)
        {
            w = sum/1000;
            for(i = 1; i <= n; i++)
            {
                for(j = wi[i]; j <= w; j++)
                    dp[j] = max(dp[j] , dp[j-wi[i]] + pi[i]);//和0---1背包正好相反
            }
            sum += dp[w];
        }
        cout<<sum<<endl;
    }
    return 0;
}

poj 2063 基础完全背包,布布扣,bubuko.com

时间: 2024-10-05 03:12:08

poj 2063 基础完全背包的相关文章

POJ 2063 Investment 完全背包

题目链接:http://poj.org/problem?id=2063 今天果然是卡题的一天.白天被hdu那道01背包的变形卡到现在还没想通就不说了,然后晚上又被这道有个不大也不小的坑的完全背包卡了好久.这题主要是说让你选择不同的债券(每种债券的费用和年利率的属性),然后n年后使得本金最大,如果仅仅是问一年的话就是个裸完全背包的题了,不过它是n年,每年得到的总利息都会加入到本金中变为下一年的本金,知道了这个后就很好处理了,在这道题里每年变化的本金就是背包容量,然后债券那两个属性就是物品的费用(o

poj 2063 Investmen 完全背包

这个题的想法不难,两个点: 1 是完全背包 2 是考虑/1000,降低复杂度 但是提交的时候反复的wa,最后找问题原来是dp开小了,可是dp本来开1005,后来开到100030过了.哎,如果没有时间计算 dp的长度的话,就往大了开,血的教训. Investment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10087   Accepted: 3539 Description John never knew he ha

POJ 2063 Investment

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

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 2392 Space Elevator 背包题解

多重背包,本题不需要二分优化.相对简单点.因为重复数十分小,小于10: 而增加一个限制每种材料的高度做法,如果使用逆向填表,那么只需要从这个高度往小递归填表就可以了. 还有就是注意要排序,以限制高度为标准从小到大排序,否则答案错误的. #include <stdio.h> #include <string.h> #include <algorithm> using std::sort; const int MAX_K = 401; const int MAX_H = 4

POJ 3211 Washing Clothes 背包题解

本题是背包问题,但是需要转化成背包的. 因为是两个人洗衣服,那么就是说一个人只需要洗一半就可以了,因为不能两个人同时洗一件衣服,所以就成了01背包问题了. 思路: 1 计算洗完同一颜色的衣服需要的总时间totTime 2 利用动态规划背包法求这些衣服能在那些时间点完成 3 求比(totTime+1)/2大的最小时间点 4 得到洗一种颜色衣服的时间,那么继续求下洗一种颜色衣服的时间 5 最后加起来就是答案了. 这个是算法问题. 剩下来就是考编程功力了,因为给出的数据,需要我们自己把衣服分类,分类之

POJ 3287 (基础BFS) Catch That Cow

这是做的第一道BFS,很基础很简单的题目 广度优先搜索算法如下:(用QUEUE)(1) 把初始节点S0放入Open表中:(2) 如果Open表为空,则问题无解,失败退出:(3) 把Open表的第一个节点取出放入Closed表,并记该节点为n:(4) 考察节点n是否为目标节点.若是,则得到问题的解,成功退出:(5) 若节点n不可扩展,则转第(2)步:(6) 扩展节点n,将其不在Closed表和Open表中的子节点(判重)放入Open表的尾部,并为每一个子节点设置指向父节点的指针(或记录节点的层次)

POJ 1742 Coins (多重背包)

Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 28448   Accepted: 9645 Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there were some

POJ 3624 Charm Bracelet 背包题解

最简单的背包问题了,本题应该除了背包就一个考点了:不能开二维数组.我没开过二维,不过看数据是不可以的.太大了. 做法有两种改进省内存DP: 1 所谓的滚动数组 2 逆向填表 很久没做背包DP,突然觉得这种背包问题很简单了. 下面给出两种解法: 1 calBag()是滚动数组 2 calBag2()是逆向填表 #pragma once #include <stdio.h> #include <stdlib.h> #include <vector> using namesp