2016-2017 ACM-ICPC NEERC - J. Bottles 二维费用背包

题目链接:http://codeforces.com/contest/730/problem/J
题目大意:在这里插入图片描述
有n个瓶子。每个瓶子有饮料a[i]。瓶子的体积为b[i]。现在想把所有的饮料倒在k个瓶子里。而且每倒一升的饮料。需要花费时间1。现在希望k最小的情况下并且花费的总时间t最少。

思路:我们可以直接求k。因为要优先满足k。那么就是: s o r t ( b + 1 , b + n + 1 ) : ∑ i = 1 k b [ i ] > = ∑ i = 1 n a [ i ] sort(b+1, b+n+1):\sum_{i=1}^k b[i] >=\sum_{i=1}^n a[i] sort(b+1,b+n+1):i=1kb[i]>=i=1na[i]
直接计算就可以了。

因为我们要把所有的饮料倒在这k个瓶子里面。那么这k个瓶子里面剩余的饮料越多越好。直接dp:

d p [ i ] [ j ] [ k ] : 前 i 个 瓶 子 中 选 择 j 个 瓶 子 , 使 得 这 j 个 瓶 子 的 容 量 为 k , 这 k 个 瓶 子 的 最 多 剩 余 饮 料 dp[i][j][k]:前i个瓶子中选择j个瓶子,使得这j个瓶子的容量为k,这k个瓶子的最多剩余饮料 dp[i][j][k]:ij使jkk

转移方程:
f ( n ) = { d p [ i ] [ j ] [ k ] = m a x ( d [ i − 1 ] [ j ] [ k ] , d p [ i − 1 ] [ k − 1 ] [ k − b [ i ] ] + a [ i ] ) , j>=b[i] d p [ i ] [ j ] [ k ] = d [ i − 1 ] [ j ] [ k ] , j<b[i] f(n)= \begin{cases} dp[i][j][k]=max(d[i-1][j][k], dp[i-1][k-1][k-b[i]]+a[i]), & \text{j>=b[i]} \\ dp[i][j][k]=d[i−1][j][k], & \text{j<b[i]} \end{cases} f(n)={dp[i][j][k]=max(d[i1][j][k],dp[i1][k1][kb[i]]+a[i]),dp[i][j][k]=d[i1][j][k],j>=b[i]j<b[i]
显然要降维:

#include <bits/stdc++.h>
using namespace std;

int a[105], b[105], c[105], f[105][10005];
int main()
{
    int n, m;scanf("%d", &n);
    int sum=0, k=0;
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i]);
        sum+=a[i];
    }
    m=sum;//a[]的和
    for(int i=1; i<=n; i++){
        scanf("%d", &b[i]);
        c[i]=b[i];
    }
    sort(c+1, c+1+n);
    for(int i=n; i>=1; i--){//求k
        sum-=c[i];
        k++;
        if(sum<=0){
            break;
        }
    }
    memset(f, -1, sizeof(f));
    f[0][0]=0;
    for(int i=1; i<=n; i++){
        for(int j=i; j>=1; j--){
            for(int k=10000; k>=b[i]; k--){
                if(f[j-1][k-b[i]]!=-1){
                    f[j][k]=max(f[j][k], f[j-1][k-b[i]]+a[i]);
                    //cout<<i<<" "<<j<<" "<<k<<" "<<f[j][k]<<endl;
                }
            }
        }
    }
    int mx=0;
    for(int i=m; i<=10000; i++){
        mx=max(mx, f[k][i]);
    }

    printf("%d %d\n", k, m-mx);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值