zoukankan      html  css  js  c++  java
  • HDU 3033 分组背包

    给出N个物品。M金钱。W种类

    给出N个物品的性质:所属种类,花费。价值

    求每一种类物品至少一个的前提下,所能购买到的最大价值


    dp[i][k]表示在第i种物品。总花费为k的最大价值

     dp[i][k]=Max(dp[i][k],dp[i][k-a[i][j].p]+a[i][j].v);

    dp[i][k]=Max(dp[i][k],dp[i-1][k-a[i][j].p]+a[i][j].v);

    一定要先推断从本组更新,避免同一个物品被用了两次

    dp[i][k]==-1 表示该状态不可到达

    #include "stdio.h"
    #include "string.h"
    
    struct node
    {
        int p,v;
    }a[11][101];
    int dp[11][10010];
    int c[11];
    int Max(int a,int b)
    {
        if (a<b) return b;
        else return a;
    }
    int main()
    {
        int n,m,i,j,k,x,ans,w;
        while (scanf("%d%d%d",&n,&m,&w)!=EOF)
        {
            memset(a,0,sizeof(a));
            memset(c,0,sizeof(c));
            for (i=1;i<=n;i++)
            {
                scanf("%d",&x);
                c[x]++;
                scanf("%d%d",&a[x][c[x]].p,&a[x][c[x]].v);
            }
    
            memset(dp,-1,sizeof(dp));
            dp[0][0]=0;
            for (i=1;i<=w;i++)
                for (j=1;j<=c[i];j++)
                    for (k=m;k>=a[i][j].p;k--)
                    {
                        if (dp[i][k-a[i][j].p]!=-1)
                        {
                            dp[i][k]=Max(dp[i][k],dp[i][k-a[i][j].p]+a[i][j].v);
                        }
                        if (dp[i-1][k-a[i][j].p]!=-1)
                        {
                            dp[i][k]=Max(dp[i][k],dp[i-1][k-a[i][j].p]+a[i][j].v);
                        }
    
    
                    }
    
            ans=-1;
            for (i=0;i<=m;i++)
                ans=Max(ans,dp[w][i]);
            if (ans==-1) printf("Impossible
    ");
            else printf("%d
    ",ans);
    
        }
        return 0;
    }
    




  • 相关阅读:
    git使用(1) --git本地基础操作
    openCV在ubuntu上的使用(0)
    x86汇编指令整理
    读书笔记--鸟哥的linux_2
    读书笔记--鸟哥的linux_1
    #转 c语言中.h文件的作用
    读书笔记--《java语言程序设计--基础篇》
    matlab plot
    关于天文中的坐标系的介绍
    FIR的学习1
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5114926.html
Copyright © 2011-2022 走看看