zoukankan      html  css  js  c++  java
  • 多重背包问题

    这里讲一讲多重背包问题

    有n种物品,背包的容量为V,接下来给出每个物品的重量w[i],价值v[i],数量c[i],求最大的价值

    有了01背包和完全背包的基础,这里就不难了

    显然dp方程为

    dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i])    (j-k*w[i]>=0 && 0<=k<=c[i])

    这里就相当于01背包了,把每个物品有c[i]个看作有c[i]个i号物品

    这不就是赤裸裸的01背包了吗?

    这里也要倒序

    贴代码

    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    #include <iostream>
    #include <cstring> 
    using namespace std;
    int n,V,dp[6010],v[6005],w[6005],c[6005];
    int main()
    {
        scanf("%d %d",&n,&V); 
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d %d",&w[i],&v[i],&c[i]);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=V;j>=w[i];j--)
            {
                for(int k=0;k<=c[i] && j-k*w[i]>=0;k++)
                {
                    dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);
                }
            }
        }
        printf("%d
    ",dp[V]);
    }
  • 相关阅读:
    NFS-heartbeat-drbd模拟NFS高可用
    drbd
    hearbeat
    ldap
    SVN
    Nginx负载均衡
    shell-day1
    angularJS(二):作用域$scope、控制器、过滤器
    angularJS(一):表达式、指令
    nodejs、npm、 typescript、angular-cli安装
  • 原文地址:https://www.cnblogs.com/wzrdl/p/9771586.html
Copyright © 2011-2022 走看看