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 }
  • 相关阅读:
    OpenShift和F5的集成手册
    OpenShift负载分区策略(Router Shading)
    Istio在Openshift 3.11的安装
    Openshift 和Harbor的集成
    OpenShift 如何获取bearer Token以便进行各种API调用
    Openshift 3.11和LDAP的集成
    Openshift 节点添加和删除
    Spring Dataflow批处理框架在OCP上的部署
    Openshift 用户,角色和RBAC
    取消Windows server 关机提示备注的方法
  • 原文地址:https://www.cnblogs.com/ldudxy/p/13493055.html
Copyright © 2011-2022 走看看