【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 }
原文地址:https://www.cnblogs.com/ldudxy/p/13493055.html