• 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;
    }    
  • 相关阅读:
    PAT 甲级 1004 Counting Leaves
    C#列的一些操作
    EXT.NET 一些用法
    ext.net 所有版本
    鱼线拉力值
    CRM 总是弹出登录窗口
    台钓线组及各种绑法
    windows server 2012 r2 安装IIS失败
    [iOS]UITableView刷新
    [Linux]APUE读书笔记: 文件和目录
  • 原文地址:https://www.cnblogs.com/Tianwell/p/11215392.html
Copyright © 2020-2023  润新知