zoukankan      html  css  js  c++  java
  • 分组背包问题

    分组背包其实也不难,弄清楚前面的这里就十分好解决了

    有容积为V的背包,有n件物品,每种物品属于的组别不同,t为最大的组数,每组中的物品相互冲突,所以只能选其中一件

    接下来是每件物品的重量w[i],价值v[i],以及组号x,求最大的价值

    因为每组物品只能选一件,我们很容易把这转化为01背包

    显然dp方程为

    dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[k]]+v[k])   (k属于第i组)

    方程的意义是选择了前i组,用了容积为j的空间所能获取的最大价值

    把它转化为一维的便可以得到

    dp[j]=max(dp[j],dp[j-w[k]]+v[k])    (k属于第i组)

    这样问题就解决了

    贴上代码

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    using namespace std;
    const int N=500;
    vector < int > g[N];
    int n,V,t,w[N],v[N],x,dp[N];
    int main()
    {
        scanf("%d %d %d",&V,&n,&t);
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d %d",&w[i],&v[i],&x);
            g[x].push_back(i);
        }
        for(int i=1;i<=t;i++)
        {
            for(int j=V;j>=0;j--)
            {
                for(int k=0;k<g[i].size();k++)
                {
                    int temp=g[i][k];
                    if(j-w[temp]>=0)
                    {
                        dp[j]=max(dp[j],dp[j-w[temp]]+v[temp]);
                    }
                }
            }
        }
        printf("%d
    ",dp[V]);
        return 0;
    }
  • 相关阅读:
    Java的 Annotation 新特性
    Java 枚举
    Java 泛型
    Linux kali信息探测以及 Nmap 初体验
    静态导入 ()
    Java foreach循环
    Java 可变参数
    炫酷的CSS3响应式表单
    关于CSS选择器连续性的问题
    简述ECMAScript6新增特性
  • 原文地址:https://www.cnblogs.com/wzrdl/p/9772338.html
Copyright © 2011-2022 走看看