dyp

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值