zoukankan      html  css  js  c++  java
  • 【PAT顶级】1002 Business (35分)(0/1背包,DP)

    题意:输入一个正整数N(<=50),表示工程的数量,接着输入N行每行包括三个正整数P,L,D分别表示工程的利润,工程所需时间和工程的deadline。输出不超时完成工程的情况下,得到的最大利润,一件工程正在进行中时不可被打断。

    思路:0/1背包,动态规划,dp[i][j],i表示当前的工程,j表示该工程开始的时间,如果当前的时间大于等于工程所需时间,那么dp[i][j]=max(dp[i][j],dp[i-1][min(j,pro[i].d)-pro[i].l]+pro[i].p),即当前利润和不包括工程i,开始时间为当前时间j和工程i的deadline的最小值减去工程i所需时间,的规划利润加上做完当前工程i可得的利润之和取最大值。

    AAAAAccepted code:

     1 #define HAVE_STRUCT_TIMESPEC
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 typedef struct st{
     5     int p,l,d;
     6 };
     7 st pro[57];
     8 bool cmp(st a,st b){
     9     return a.d<b.d;
    10 }
    11 int dp[57][1007];
    12 int main(){
    13     ios::sync_with_stdio(false);
    14     cin.tie(NULL);
    15     cout.tie(NULL);
    16     int n;
    17     cin>>n;
    18     for(int i=1;i<=n;++i)
    19         cin>>pro[i].p>>pro[i].l>>pro[i].d;
    20     sort(pro+1,pro+1+n,cmp);
    21     for(int i=1;i<=n;++i){
    22         for(int j=1;j<=pro[n].d;++j){
    23             dp[i][j]=dp[i-1][j];
    24             if(j>=pro[i].l&&pro[i].d>=pro[i].l)
    25                 dp[i][j]=max(dp[i][j],dp[i-1][min(j,pro[i].d)-pro[i].l]+pro[i].p);//[min(j,pro[i].d)-pro[i].l]这里不对第二维该工程开始的时间进行取最小的话,会导致这个工程做完的时间已经超出了deadline
    26         }
    27     }
    28     cout<<dp[n][pro[n].d];
    29     return 0;
    30 }
  • 相关阅读:
    KMP字符串查找
    基数排序
    二分查找来查找旋转数组
    通过前序(后序)+中序创建树
    二维数组找最大值
    用字符串的空格替换其他字符
    桶排序
    字符串的排列
    和为S的两个数字
    整数中1出现的次数(从1到n整数中1出现的次数)
  • 原文地址:https://www.cnblogs.com/ldudxy/p/13493055.html
Copyright © 2011-2022 走看看