#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn = 1e2;
int pre[maxn], qre[maxn];
int dp[maxn][maxn][maxn][maxn];
int n, d, dm;
struct node{
int p, q, id;
}job[maxn];
int cmp(node a, node b){
return a.p > b.p;
}
int main(){
cin >> n >> dm;
for(int i = 1; i <= n; i ++){
cin >> pre[i];
}
for(int i = 1; i <= n; i++){
cin >> qre[i];
}
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++){
job[i].id = i;
job[i].p = pre[i];
job[i].q = qre[i];
}
sort(job + 1, job + n + 1, cmp);
int t = 0;
for(int i = 1; i <= n; i++){//每一个阶段
for(int n1 = 1; n1 <= i; n1++){
if(t + job[i].p > dm)dp[i][n1][i - n1][t] = job[i].q + dp[i - 1][n1][i - n1][t];
t += job[i].p;
int cnt = min((n1 - 1) * job[i].p + dp[i - 1][n1 - 1][i - n1][t - job[i].p], n1 * job[i].p + dp[i - 1][n1][i - n1 - 1][t - job[i].p]);
if(job[i].q + dp[i - 1][n1][i - n1][t] < cnt){
t -= job[i].p;
cnt = job[i].q + dp[i - 1][n1][i - n1][t];
}
dp[i][n1][i - n1][t] = cnt;
}
}
int res = inf, num, num1;
for(int i = n; i >= 1; i --){
for(int n1 = i; n1 >= 0; n1 --){
for(int t = dm; t >= 0; t--){
if(dp[i][n1][i - n1][t] > 0)
if(dp[i][n1][i - n1][t] < res){
res = dp[i][n1][i - n1][t];
num = i, num1 = n1;
}
}
}
if(res != inf)break;
}
cout << res;
return 0;
}
dyp
最新推荐文章于 2020-02-12 16:00:55 发布