• 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
  • 相关阅读:
    vbr mp3
    NDK setup error
    转载 MPEG2视频解码在ARM11上的优化
    arm程序设计优化
    小情歌
    android update project
    Linux环境下的DNW使用
    2010的计划
    Setting up UDEV rules to grant access to your phone
    Debugging Native Code for android
  • 原文地址:https://www.cnblogs.com/acm-jing/p/4314311.html
Copyright © 2020-2023  润新知