hdu 1963 Investment(完全背包)

点击打开链接hdu 1963

思路: 完全背包
分析:
1 根据题目很容易分析出题目是裸的完全背包,但是经过题目的条件我们发现dp数组开不下(怒RE不解释)
2 然后发现题目说了所有的bonds的value都是1000的整数倍,因此这边我们把sum和所有value都除以1000这样就降低了空间,那么dp数组就可以开的下了

代码:

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

const int N = 11;
const int MAXN = 1000010;

int sum , year , n , v[N] , w[N];
long long ans , dp[MAXN];

void solve(){
    ans = sum;
    sum /= 1000;
    memset(dp , 0 , sizeof(dp));
    for(int i = 1 ; i <= n ; i++)
        for(int j = v[i] ; j < MAXN ; j++)
            dp[j] = max(dp[j] , dp[j-v[i]]+w[i]);
    while(year--)
        ans += dp[ans/1000];
    printf("%lld\n" , ans);
}

int main(){
    int Case;
    scanf("%d" , &Case);
    while(Case--){
        scanf("%d%d" , &sum , &year);
        scanf("%d" , &n);
        for(int i = 1 ; i <= n ; i++){
            scanf("%d%d" , &v[i] , &w[i]);
            v[i] /= 1000;
        }
        solve();
    }
    return 0;
}
时间: 2024-09-15 01:41:13

hdu 1963 Investment(完全背包)的相关文章

HDU 4341 判断共线+背包

题意:黄金矿工的意思,每个点有价值和时间,如果共线得从最近的开始取,问求时间t內取到的最大价值. 这题把共线的情况看成一组,要取某个点的话必须把跟这个点共线并且与原点距离在这个点之前的点取到.所以把每条线上的分组用分组背包就可以了. #include <iostream> #include<cstring> #include<cstdio> #include<cstring> #include<algorithm> using namespace

hdu 1114 Piggy-Bank(完全背包)

点击打开链接hdu1114 思路: 裸完全背包 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int N = 510; const int MAXN = 10010; int sum , n; int p[N] , w[N]; int dp[

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

HDU 3339 In Action:最短路+背包

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3339 题目: Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the number of nuclear weapons have soared across the globe. Nowadays,the crazy bo

算法:hdu 2639 Bone Collector II (dp 01背包求第k优解)

题目大意: 有n件物品,每件物品有体积和价值两个属性, 一个小偷带着一个大小为v的背包,要 偷这些东西,问小偷能偷的第k大的价值是多少? 思路: 这题和典型的01背包求最优解不同, 是要求第k大的解,所以,最直观的想法就是在01背包的基础上再增加一维,用来保存前k大小的数,然后在 递推时,根据前一个状态的前k 大小的数推出下一个阶段的前k个数保存下来. d[i][j][k], 表示取前i个物品,用j的费用,第k大价值是多少 在递推d[i][j][1...k]时,先获取上一个状态d[i- 1][j

hdu 2955 Robberies(0/1背包)

点击打开链接hdu 2955 思路: 0/1背包 分析: 1 按照题目的意思我们很容易知道这就是一个0/1背包问题,如果我们把概率当作是背包的容量,那么我们遇到一个问题就是浮点数的dp,因为题目没有告诉我们小数点具体几位,那么我们就不能够通过乘上10^n来转化为整数,所以我们应该考虑换种思想 2 按照正常的思路是dp[i][j]表示前i个物品放入概率为j的最大价值,那么我们这边把价值当成背包来看的话我们设dp[i][j]表示前i个物品放入金钱为j的最小被抓概率(因为题目不好求最小概率我们可以认为

hdu 3466 Proud Merchants(0/1背包)

点击打开链接hdu 3466 思路: 0/1背包 分析: 1 这一题和"hdu2546 饭卡"有点像,但是又有不同,不同的是这一题每一个物品都有一个限制的值Q[i],求最大的价值 2 题目明确提到每一种物品只能卖一次或这不卖,那这明显就是0/1的性质,但是现在多了一个条件钱不能少于Q[i].这边的话我各种YY无果之后,果断看了题解,发现是要按照q-p排序,然后再做dp. 3 经过一番的YY之后,我明白了为什么按照q-p是正确的.我们都知道dp有一个很重要的特点就是无后效性,如果没有金钱

hdu 2639 Bone Collector II (0/1背包)

点击打开链接hdu 2639 思路: 0/1背包求第k优解 分析: 1 其基本思想是,将每个状态都表示成有序队列,将状态转移方程中的 max/min 转 化成有序队列的合并. 2 这里仍然以 01 背包为例讲解一下.    首先看 01 背包求最优解的状态转移方程: F [i, v] = max{F [i − 1, v], F [i − 1, v −Ci ] + Wi }.如果要求第 K 优解,那么状态 F [i, v] 就应该是一个大小为 K 的队列F [i, v, 1 . . . K].其中

hdu 2546 饭卡(0/1背包)

点击打开链接hdu 2546 思路: 贪心+0/1背包 分析: 1 题目中收到只有当余额大于等以5的时候才可以买东西,那么我们利用m-5去买这样保证了于额不会小于5,那么这样就可以买东西了,因为最后可能还有点于额(为0)的时候也是可以买的,那么最后一次就买最贵的这样保证于额最少了. 2 这边我们用到贪心+dp的思想,总体不好想,对于我这种dp弱逼来说没有题解我真不懂(有了题解也不懂) 代码: #include<cstdio> #include<cstring> #include&l