zoukankan      html  css  js  c++  java
  • HDU-3033 I love sneakers! (分组背包)

    题意:n种鞋子,m总金额,k品牌数 (1<=N<=100  1 <= M<= 10000 1<=K<=10) 然后对应n个鞋子给出对应的 编号a 金额b 价值c( 1<=a<=k, b and c, 0<=b,c<100000)

    思路:事实上对于其他背包的限制,这里在于每种品牌只能取一个 那么我们可以循环每个种类,然后每次选择种类中的一个 然后再换到下一种 又取一个...

    所以就将以前的v[j] 增加为v[i][j] 用i来表示种类 ,循环i ; 当然我们也可用vector数组来记录,这样直接用 s.size()就可以得到该种类的长度 而不必要再去统计。

    题解:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    using namespace std;
    
    int N,M,K;
    int p[15][105],v[15][105];
    int dp[15][10005];
    const int INF = 1e5;
    
    int main(){
        while(scanf("%d%d%d",&N,&M,&K)!=EOF){
            memset(p,0,sizeof(p));
            memset(v,0,sizeof(v));
            for(int i=1;i<=N;i++){
                int x,y,z;
                scanf("%d%d%d",&x,&y,&z);
                ++p[x][0];//就利用自身第0个位置来记录种类个数
                ++v[x][0];
                p[x][p[x][0]] = y;
                v[x][v[x][0]] = z;
            }
            //不要用memset()要保留dp[0][] = 0 
            for(int i=1;i<=10;i++){
                for(int j=0;j<10005;j++){
                    dp[i][j] = -INF;
                }
            }
            for(int i=1;i<=K;i++){
                for(int k=1;k<=p[i][0];k++){
                    for(int j=M;j>=p[i][k];j--){
                            dp[i][j] = max(dp[i][j],max(dp[i-1][j-p[i][k]]+v[i][k],dp[i][j-p[i][k]]+v[i][k]));
                    }
                }
            }
            if(dp[K][M]<0) puts("Impossible");
            else printf("%d
    ",dp[K][M]);
        }
        return 0;
    }    
  • 相关阅读:
    在Ubuntu中通过update-alternatives切换软件版本
    SCons: 替代 make 和 makefile 及 javac 的极好用的c、c++、java 构建工具
    mongodb 的使用
    利用grub从ubuntu找回windows启动项
    How to Repair GRUB2 When Ubuntu Won’t Boot
    Redis vs Mongo vs mysql
    java script 的工具
    python 的弹框
    how to use greendao in android studio
    python yield的终极解释
  • 原文地址:https://www.cnblogs.com/Tianwell/p/11215392.html
Copyright © 2011-2022 走看看