程序填空题:求解双核处理问题(动态规划)
求解双核处理问题。一种双核CPU的两个核能够同时处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1KB,每个核同时只能处理一项任务,n个任务可以按照任意顺序放入CPU进行处理。编写一个程序求出一个设计方案让CPU处理完这批任务所需的时间最少,求这个最少的时间。(提示:完成n个任务需要sum时间,放入两个核中执行,假设第一个核的处理时间为n1,第二个核的处理时间为sum-n1,并假设n1≤sum/2,sum-n1≥sum/2,要使处理时间最小,则n1越来越靠近sum/2,最终目标是求max(n1,sum-n1)的最大值。
```c++
#include
using namespace std;
#define M 100
long length[M];
long dp[10000]={0};
int n;
void solve();
int main()
{ void solve();
cin>>n;
for(int i=0;i cin>>length[i];
solve();
return 0;
}
void solve()
{
int i,j;
long sum=0;
for(i=0;i {
length[i]=length[i]>>10;
sum=;
}
for(i=0;i {
for(j=length[i];j<=sum/2;j++)
dp[j]=max(dp[j],);
}
cout<<(max(dp[sum/2],sum-dp[sum/2])<<10);
}
```
### 输入格式:
第一行输入一个整数n表示任务数,第二行再依次输入n个数,每个数表示任务长度,单位为KB(每个数均为1024的倍数)。
### 输出格式:
输出一个整数表示最少需要处理的时间。
### 输入样例1:
```in
5
3072 3072 7168 3072 1024
```
### 输出样例1:
```out
9216
```
答案:
第1空:sum+length[i]
第2空:dp[j-length[i]]+length[i]
```c++
#include
using namespace std;
#define M 100
long length[M];
long dp[10000]={0};
int n;
void solve();
int main()
{ void solve();
cin>>n;
for(int i=0;i
solve();
return 0;
}
void solve()
{
int i,j;
long sum=0;
for(i=0;i
length[i]=length[i]>>10;
sum=;
}
for(i=0;i
for(j=length[i];j<=sum/2;j++)
dp[j]=max(dp[j],);
}
cout<<(max(dp[sum/2],sum-dp[sum/2])<<10);
}
```
### 输入格式:
第一行输入一个整数n表示任务数,第二行再依次输入n个数,每个数表示任务长度,单位为KB(每个数均为1024的倍数)。
### 输出格式:
输出一个整数表示最少需要处理的时间。
### 输入样例1:
```in
5
3072 3072 7168 3072 1024
```
### 输出样例1:
```out
9216
```
答案:
第1空:sum+length[i]
第2空:dp[j-length[i]]+length[i]