【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 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)