标签:
用DP[i][j]表示前i项任务,A完成需要j时间,B完成需要DP[i][j]时间。
递推方程也很容易得出来
DP[i][j]=min(DP[i-1][j]+B[i],DP[i-1][j-A[i]])//其中A[i],B[i]分别表示A,B完成第i项任务需要的时间。
下附代码
1 #include <algorithm> 2 #include <iostream> 3 #include <fstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cmath> 7 using namespace std; 8 ifstream fin("divide.in"); 9 ofstream fout("divide.out"); 10 int DP[203][40005]={0},rws=0,rw[203][2]={0}; 11 int main(void) 12 { 13 fin>>rws; 14 for(int i=1;i<=rws;i++)fin>>rw[i][0]>>rw[i][1]; 15 DP[0][0]=0; 16 int num=0; 17 for(int i=1;i<=rws;i++) 18 { 19 num+=rw[i][0]; 20 for(int j=0;j<=num;j++) 21 { 22 DP[i][j]=DP[i-1][j]+rw[i][1]; 23 if(j>=rw[i][0]) 24 { 25 DP[i][j]=min(DP[i][j],DP[i-1][j-rw[i][0]]); 26 } 27 } 28 } 29 int ans=0x7fffffff; 30 for(int i=1;i<=num;i++) 31 { 32 ans=min(ans,max(DP[rws][i],i)); 33 } 34 fout<<ans; 35 return 0; 36 }
标签:
原文地址:http://www.cnblogs.com/CYWer/p/4923355.html