zoukankan      html  css  js  c++  java
  • dp之二维背包hdu3496

    题意:给你n张电影门票,但一次只可以买m张,并且你最多可以看L分钟,接下来是n场电影,每一场电影a分钟,b价值,要求恰好看m场电影所得到的最大价值,要是看不到m场电影,输出0;

    思路:这个题目可以很明显的看出来,有两个限制条件,必须看m场电影的最大价值........其实我前面在01背包时提过,对于这样的条件,要可以看第n场电影,那么相对应的第n-1场电影必须看了,否则不能进行动态转移.......我的想法是,0代表着这场电影没有看,>0代表这场电影看了。其他的就是动态转移了,很容易得到,dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+val[i])........当然,在最开始的dp[0][0]=1,那么得到的最大值会在第m场电影里面,最大值需要减去初始值........也就是1

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int dp[105][1005],s[105][2];
    int max(int x,int y)
    {
        if(x>y)
        return x;
        else
        return y;
    }
    int main()
    {
        int text;
        scanf("%d",&text);
        while(text--)
        {
            int N,M,L;
            scanf("%d %d %d",&N,&M,&L);
            for(int i=1;i<=N;i++)
            scanf("%d %d",&s[i][0],&s[i][1]);
            memset(dp,0,sizeof(dp));
            dp[0][0]=1;
            for(int i=1;i<=N;i++)
            {
                for(int j=M;j>=0;j--)
                {
                    for(int k=L;k>=0;k--)
                    {
                        if(k>=s[i][0]&&j>0&&dp[j-1][k-s[i][0]]&&dp[j][k]<dp[j-1][k-s[i][0]]+s[i][1])
                        {
                            dp[j][k]=dp[j-1][k-s[i][0]]+s[i][1];
                        }
                    }
                }
            }
            int i,maxn=0;
            for(i=0;i<=L;i++)
            if(dp[M][i]>maxn)
            maxn=dp[M][i];
            if(maxn==0)
            printf("0
    ");
            else
            printf("%d
    ",maxn-1);
        }
        return 0;
    }
    
  • 相关阅读:
    Mysql 重做日志及与二进制日志的区别
    【MySql】性能优化之分析命令
    ubuntu一些基本软件安装方法
    Linux学习笔记
    exp/imp三种模式——完全、用户、表
    Oracle学习日志20150302
    如何在macOS Sierra中运行CORE Keygen破解程序
    国内各大互联网公司技术站点集合
    React Native资料
    React Native集成到现有项目(非cocoa pods)
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3222693.html
Copyright © 2011-2022 走看看