【SWUST OJ】 698: Independent Task Scheduling

Independent Task Scheduling

首先给予dp数组定义

dp[i][j] 为前i个工作,A工作时间为j时,B的工作时间

然后这题就变成水题了

首先状态转移方程为 

dp[i][j] = min(dp[i-1][j-a[i]],dp[i-1][j] + b[i]);

然后枚举每一个A所需要的时间直到A机器所有作业时间总和

取得max(i,dp[n][i]) 为做完所有作业需要的时间, 然后取最小值即为所求

 

#include <iostream>
#include <cstdio>
#include <string>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <bitset>
#include <algorithm>
#include <climits>
#include<cstring>
using namespace std;
#define Pair pair<int, int>
#define ULL unsigned long long
#define LS l,mid,lson
#define RS mid+1,r,rson
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define lowbit(x) (x&-x)
#define girlfriend zy
#define ll long long
const int maxn = 100000;
using namespace std;
int a[maxn];
int b[maxn];
int dp[maxn][1000];
int main()
{
    int n;
    cin>>n;
    int sum = 0;
    int ans = INF;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=sum;j++)
        {
            if(a[i] <= j)
            {
                dp[i][j] = min(dp[i-1][j-a[i]],dp[i-1][j] + b[i]);
            }
            else
            {
                dp[i][j] = dp[i-1][j] + b[i];
            }
        }
    }
    for(int i=1;i<=sum;i++)
    {
        int t;
        t = max(i,dp[n][i]);
        ans = min(t,ans);
    }
    cout<<ans<<endl;
}
View Code

 

 

 

 

原文地址:https://www.cnblogs.com/lightWh1te/p/14145850.html