【动态规划】多重背包

贵有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。

【动态规划】多重背包

时间限制: 1 Sec  内存限制: 64 MB
提交: 5  解决: 5
[提交][状态][讨论版]

题目描述

张琪曼:“魔法石矿里每种魔法石的数量看起来是足够多,但其实每种魔法石的数量是有限的。”

李旭琳:“所以我们需要改变装包策略啦。”

现有N(N≤10)种魔法石和一个容量为V(0<V<200)的背包。第i种魔法石最多有n[i]件可用,每个占用的空间是c[i],价值是w[i]。全部物品总数不超过50。求解将哪些魔法石装入背包可使这些物品的容量总和不超过背包容量,且价值总和最大。

输入

第一行为两个数字,即V和N。以下N行为每种物品的空间,价值和数量。

输出

最大价值总和。

样例输入

8 2
2 100 4
4 100 2

样例输出

400

裸用之前写的背包问题的模板就可以。。。。。
#include <iostream>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int f[222],v[11],w[11],num[11];
int n,m;

//m背包的总容量、v物品的体积、w物品的价值
void OneZeroPack(int m,int v,int w)  //0-1背包
{
    for(int i=m;i>=v;i--)
        f[i]=max(f[i],f[i-v]+w);
}

//m背包的总容量、v物品的体积、w物品的价值
void CompletePack(int m,int v,int w)  //完全背包
{
    for(int i=v;i<=m;i++)
        f[i]=max(f[i],f[i-v]+w);
}

//m背包的总容量、v物品的体积、w物品的价值、num物品的数量
void MultiplePack(int m,int v,int w,int num)//多重背包
{
    if(v*num>=m)
    {
        CompletePack(m,v,w);
        return ;
    }
    int k=1;
    for(k=1;k<=num;k<<=1)
    {
        OneZeroPack(m,k*v,k*w);
        num=num-k;
    }
    if(num)
        OneZeroPack(m,num*v,num*w);
}

int main()
{
    while(cin>>m>>n)
    {
        for(int i=0;i<n;i++)
            cin>>v[i]>>w[i]>>num[i];
        memset(f,0,sizeof(f));
        for(int i=0;i<n;i++)
        {
            MultiplePack(m,v[i],w[i],num[i]);
        }
        cout<<f[m]<<endl;
    }
    return 0;
}
 
时间: 2024-11-29 05:04:35

【动态规划】多重背包的相关文章

动态规划—多重背包

多重背包类似于完全背包,只是每个物品可以选取的数目已经告诉我们了,做题的思路和完全背包几乎一样. 对于二维数组的做法,我们只要对k多做一个k<=c[i]的限制即可,c[i]是第i件物品最多能选用的次数. 看题: 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买.请问:你用有限的资金最多能采购多少公斤粮食呢? 后记:人生是一个充满了变数的生命过程,天灾.人祸.

多重背包-动态规划(2)

汶川大地震——HDU 2191 简单的多重背包 时间不多 最近拖拖拉拉 暂时没时间再深入理解动态规划了 把这个改成01背包简单贴一下代码... 埋下了这样的坑 # include<iostream> # include<algorithm> # include<cstring> using namespace std; //n,m,p,h,c int dp[105]; int p[105], h[105], c[105]; int n, m; void mul_bag(

【动态规划】背包问题(一) 01背包 完全背包 多重背包

一.01背包 有N件物品和一个容量为V的背包.第i件物品的价格(即体积,下同)是w[i],价值是c[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 这是最基础的背包问题,总的来说就是:选还是不选,这是个问题<( ̄ˇ ̄)/ 相当于用f[i][j]表示前i个背包装入容量为v的背包中所可以获得的最大价值. 对于一个物品,只有两种情况 情况一: 第i件不放进去,这时所得价值为:f[i-1][v] 情况二: 第i件放进去,这时所得价值为:f[i-1][v-c[i]]+w

有关货币问题的动态规划题目--有关01背包,完全背包,多重背包

背包dp:参考背包九讲以及给出一些题目 01背包 (先枚举物品,再逆序枚举容量) 给定n件物品和一个容量为V的背包,每件物品的体积是w[i],价值是va[i](1<=i<=n),求在不超过背包的容量的情况下,怎么选择装这些物品使得得到的价值最大? 例如:有5件物品,体积分别是{2,2,6,5,4},价值分别是{6,3,5,4,6} 递归式:F(i,v)=max(F(i-1,v), F(i-1,v-w[i])+va[i]),其中F(i,v)表示把前i种物品恰放入背包容量为v时取得的最大价值 把这

动态规划之背包问题-01背包+完全背包+多重背包

01背包 有n种不同的物品,每种物品分别有各自的体积 v[i],价值 w[i]  现给一个容量为V的背包,问这个背包最多可装下多少价值的物品. 1 for(int i = 1; i <= n; i++) 2 for(int j = V; j >= v[i]; j--) 3 dp[j] = max(dp[j], dp[j-v[i]]+w[i]); //dp[V]为所求 完全背包 01背包每种物品只能取一个, 完全背包即物品不记件数,可取多件. 1 for(int i = 1; i <= n

dp背包问题/01背包,完全背包,多重背包,/coin change算法求花硬币的种类数

一步一步循序渐进. Coin Change 具体思想:给你 N元,然后你有几种零钱S={S1,S2...,Sm} (每种零钱数量不限). 问:凑成N有多少种组合方式  即N=x1 * S1+x2*S2+...+xk*Sk (xk>=0,k=1,2..m) 设有f(x)中组合方式 有两种解答(自底向上回溯): 1.不用第m种货币   f(N,m-1) 2.用第m种货币 f(N-Sm,m) 总的组合方式为f(N,m)=f(N,m-1)+f(N-Sm,m) anything is nonsense,s

动态规划(背包题目)

完全背包 hdu 1248 寒冰王座 hdu 1284 钱币兑换问题 hdu 3732 Ahui Writes Word:将01背包转化为多重背包,即完全背包. 0-1背包 hdu 2546 饭卡:因为要占最大的便宜,所以留5元买最贵的菜,因为每种菜只能买一次,用0-1背包 求出买菜用的最大支出 hdu 3466 Proud Merchants:当钱少于Qi时,不将物品卖出,计算过程中要注意方程无后效性,对 Pi-Qi进行排序,小的排在前面.然后用0-1背包解题,其中的约束条件为拥有的钱不少于Q

hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)

本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01背包解.多重背包转化为01背包的关键在于把件数从整体中孤立出来作为一个新的个体,也就是说不管分类,有多少件就有多少种. AC代码: //============================================================================ // Na

背包问题(01背包,完全背包,多重背包)

转自:http://www.cnblogs.com/daoluanxiaozi/archive/2012/05/06/2486105.html 背包问题,经典有背包九讲. 01背包 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑士:"我要买道具!" 地精商人:"我们这里有三种道具,血瓶150块一个,魔法药200块一个,无敌药水350块一个." 死亡骑士