【动态规划】多重背包

问题 Q: 【动态规划】多重背包

时间限制: 1 Sec  内存限制: 64 MB
提交: 112  解决: 49
[提交] [状态] [讨论版] [命题人:admin]

题目描述

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

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

现有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

AC代码

#include <cstdio>

#include <iostream>

#include <cstring>

#include <algorithm>

using namespace std;

int w[100100],c[100100],m[100100];

int f[100100];

int n,v;

int multiple()

{

    for(int i=1;i<=n;i++)

    {

        if(m[i]*c[i]>=v)

            for(int j=c[i];j<=v;j++)

                f[j]=max(f[j],f[j-c[i]]+w[i]);

        for(int k=1;k<m[i];m[i]-=k,k<<=1)

            for(int j=v;j>=k*c[i];j--)

                f[j]=max(f[j],f[j-k*c[i]]+w[i]*k);

        for(int j=v;j>=c[i]*m[i];j--)

            f[j]=max(f[j],f[j-m[i]*c[i]]+w[i]*m[i]);

    }

    return f[v];

}

int main()

{

    cin>>v>>n;

    for(int i=1;i<=n;i++)

        cin>>c[i]>>w[i]>>m[i];

    cout<<multiple()<<endl;

    return 0;

}

猜你喜欢

转载自blog.csdn.net/YT201758501112/article/details/81459809
今日推荐