• HDU


    题意

    有n件物品,每个物品属于特定的品牌,且价格和收益两个属性.每个品牌最多买1个东西,求最大收益.

    分析

    (dp[i][j]) 枚举前i个品牌,话费为j的最大收益.则分组背包有状态转移:

    [dp[i][j] = max(dp[i][j], max(dp[i][j-w]+v,dp[i-1][j-w]+v)) ]

    因为要判断无解的情况,所以将dp[i][j]初始成-1,最后检查dp[k][m]是否被修改.

    #include<bits/stdc++.h>
    #define PII pair<int,int>
    #define MP make_pair
    #define X first
    #define Y second
    using namespace std;
    const int maxn = 1e4+5;
    typedef long long LL;
    int dp[105][maxn];
    vector<pair<int,int> > vz[15];
    
    
    int main()
    {
        #ifndef ONLINE_JUDGE
            freopen("in.txt", "r", stdin);
            freopen("out.txt", "w", stdout);
        #endif
        int n,m,k;
        while(scanf("%d %d %d",&n, &m, &k)==3){
            memset(dp,-1,sizeof(dp));
            memset(dp[0],0,sizeof(dp[0]));
    
            for(int i=0;i<15;++i) vz[i].clear();
    
            for(int i=1,a,b,c;i<=n;++i){
                scanf("%d %d %d",&a, &b, &c);
                vz[a].push_back(MP(b,c));
            }
    
            for(int t=1;t<=k;++t){
                for(int i=0;i<vz[t].size();++i){
                    int w = vz[t][i].X;
                    for(int j=m;j>=w;--j){
                        int v = vz[t][i].Y;
                        if(dp[t][j-w]!=-1)
                            dp[t][j] = max(dp[t][j],dp[t][j-w]+v);
                        if(dp[t-1][j-w]!=-1){
                            dp[t][j] = max(dp[t][j],dp[t-1][j-w]+v);
                        }
                    }
                }
            }
    
            if(dp[k][m]==-1) printf("Impossible
    ");
            else printf("%d
    ",dp[k][m]);
        }
        return 0;
    }
    
    
  • 相关阅读:
    解决linux下打开windows下压缩文件乱码的问题
    vim & emacs 强制修改 root 权限的文件
    在ubuntu下,给 svn diff 一点颜色
    sql优化(一)
    sql优化(二) 索引(一)
    Java反射与思想!
    JDK5.0枚举 泛型 注释
    忘羡的Day9!
    来博客的第二天!
    来博客第一天
  • 原文地址:https://www.cnblogs.com/xiuwenli/p/9833073.html
Copyright © 2020-2023  润新知