zoukankan      html  css  js  c++  java
  • hdu Watch The Movie

    这道题是二维背包的问题,因为这道题里面有时间l和可选数量m两个约束条件。只要0/1背包的基础上再加上一重循环即可,这题需要注意的是初始化的问题,初始化时只有m=0时dp数组为0,其它置为负数。再一个就是程序第三重循环中的那一个判断,此判断的目的是dp[j][k]的最优子结构是否存在。本题的状态转移方程是: dp[j][k]=max{dp[j][k],dp[j-1][k-dvd[i].time]+dvd[i].value}.

     1 #include"iostream"
     2 #include"stdio.h"
     3 #include"algorithm"
     4 #include"string.h"
     5 #include"cmath"
     6 #define mx 1005
     7 using namespace std;
     8 struct node
     9 {
    10     int time;
    11     int value;
    12 }dvd[mx];
    13 int dp[mx][mx];
    14 int main()
    15 {
    16     int t,l,n,m;
    17     cin>>t;
    18     while(t--)
    19     {
    20         cin>>n>>m>>l;
    21         int i,j,k;
    22         for(i=1;i<=n;i++)
    23         {
    24             cin>>dvd[i].time>>dvd[i].value;
    25         }
    26         memset(dp,-1,sizeof(dp));
    27         for(i=0;i<=l;i++) dp[0][i]=0;
    28         for(i=1;i<=n;i++) //物品的种类从0到n-1循环
    29         {
    30             if(dvd[i].time>l) continue;
    31             for(j=m;j>=1;j--)
    32             {
    33                 for(k=l;k>=dvd[i].time;k--)
    34                 {
    35                     if(dp[j-1][k-dvd[i].time]!=-1) //这里加上一个判断
    36                     if(dp[j][k]<dp[j-1][k-dvd[i].time]+dvd[i].value) 
    37                         dp[j][k]=dp[j-1][k-dvd[i].time]+dvd[i].value;
    38                 }
    39             }
    40         }
    41         if(dp[m][l]!=-1)
    42         cout<<dp[m][l]<<endl;
    43         else cout<<0<<endl;
    44     }
    45     return 0;
    46 }
    View Code
  • 相关阅读:
    转载阿里开源的分布式事务框架 Seata
    查看进程上的线程数量
    chmod命令
    查找端口与查找正在运行的进程
    可输入的文本框
    js 类和对象
    js 三维数组
    ajax
    ORACLE数据库主要的系统表和数据字典视图
    url 传参
  • 原文地址:https://www.cnblogs.com/acm-jing/p/4314311.html
Copyright © 2011-2022 走看看