zoukankan      html  css  js  c++  java
  • HUST 1354

    1354 - Rubiks

    时间限制:1秒 内存限制:64兆

    452 次提交 102 次通过
    题目描述
    Isun is a genius. Not only he is an expert in algorithm, but also he plays damn-good in many funny games. Besides, he can recover a Rubik in 16 seconds or even less. The man is very crazy about Rubiks, and he has bought a lot of Rubiks. As we know, there are so many kinds of Rubiks in the world. Isun wants to buy the most valuable ones with his limited money. There are N kinds of Rubiks in all. Each of them has a price Pi(1<=i<=N) RMB and a value Vi(1<=i<=N). Isun will pay no more than M (RMB) in total. In addition, there are some Rubik families like “甲X” or “封X”. And a kind of Rubik belongs to one family at most. If Isun buys a group of them, the value of them as a family will increase. Can you get the largest value of the Rubiks that Isun can get with M (RMB). (Isun just buy one Rubik each kind at most)
    输入
    The input contains several test cases and is ended by EOF. Each test case begins with two integers: N (1<=N<=1000) and M (1<=M<=10000). The second line contains N integers representing the prices of the Rubiks. (1<=Pi<=10000) The third line contains N integers representing the value of the Rubiks. (1<=Vi<=10000) Then a line contains an integer G(0<=G<=15) representing the number of the Rubik families. Next G lines each with a start of an integer Si(1<=Si<=N) representing the number of Rubiks in the ith family. The following Si integers represent Rubik’s id (which start from 1 to N). And an integer Yi at the end means the value increased if you buy them all.(1<=Yi<=10000)
    输出
    There should be one line per test case containing the largest value.
    样例输入
    4 10
    4 5 3 6
    1 2 100 200
    1
    2 1 2 330
    
    样例输出

    333

    动态规划

    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <algorithm>
    #include <stdio.h>
    
    using namespace std;
    int v[1020];
    int w[1020];
    int v2[20];
    int w2[20];
    int dp[10005];
    int bp[10005];
    int tag[1005];
    int b[20][1005];
    int n,m;
    int g;
    int s[20],sv;
    int a;
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=1;i<=n;i++)
                scanf("%d",&w[i]);
            for(int i=1;i<=n;i++)
                scanf("%d",&v[i]);
            scanf("%d",&g);
            memset(tag,0,sizeof(tag));
            for(int i=1;i<=g;i++)
            {
                scanf("%d",&s[i]);
                int value=0;int weight=0;
                for(int j=1;j<=s[i];j++)
                {
                    scanf("%d",&b[i][j]);
                    tag[b[i][j]]=i;
                    value+=v[b[i][j]];
                    weight+=w[b[i][j]];
                }
                scanf("%d",&a);
                value+=a;
                w2[i]=weight;
                v2[i]=value;
            }
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
            {
                if(!tag[i])
                {
                    for(int j=m;j>=w[i];j--)
                        dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
                }
            }
            for(int i=1;i<=g;i++)
            {
                memcpy(bp, dp, sizeof(dp));
                for(int j=m;j>=w2[i];j--)
                        bp[j]=max(bp[j],bp[j-w2[i]]+v2[i]);
                    for(int k=1;k<=s[i];k++)
                    {
                        for(int j=m;j>=w[b[i][k]];j--)
                            dp[j]=max(dp[j],dp[j-w[b[i][k]]]+v[b[i][k]]);
                    }
                 for(int j=1;j<=m;j++)
                    dp[j]=max(dp[j],bp[j]);
                
            }
            printf("%d
    ",dp[m]);
        }
        return 0;
    }
    


  • 相关阅读:
    数据库系统原理:范式理论
    数据库系统原理:MVCC
    数据库系统原理:悲观锁、乐观锁
    数据库系统原理:封锁
    数据库系统原理:四大隔离级别
    数据库系统原理:ACID的作用以及实现原理
    计算机网络HTTP:长连接与短连接
    计算机网络HTTP:HTTP缓存
    计算机网络HTTP:状态码
    yum安装Docker
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228651.html
Copyright © 2011-2022 走看看