Elevator Rides

题目描述

There are n people who want to get to the top of a building which has only one elevator. You know the weight of each person and the maximum allowed weight in the elevator. What is the minimum number of elevator rides?

输入

The first input line has two integers n and x: the number of people and the maximum allowed weight in the elevator.

The second line has n integers w1,w2,...,wn: the weight of each person.

Constraints

1 ≤ n ≤ 20

1 ≤ x ≤ 109

1 ≤ wi ≤ x

输出

Print one integer: the minimum number of rides.

样例输入
复制代码
4 10
4 8 6 1
样例输出
复制代码
2

**题目大意:**n个人,只有一台电梯,电梯最大载重为x,为最少需要上几趟

**思路:**n<=20,想到状压dp,定义mask状态,0表示不选,1表示选,用dp[mask]表示选择mask状态的人时,需要的最少趟数,由于每一趟都是最少的趟数,在新添加一个人时,只需要考虑它能不能上最后那一趟电梯,所以还需要记录最后一趟的剩余载重。

另外注意,状压dp中的状态更新后的current可能是由多个mask更新而来的,所以需要最后在与之前的dp[current]进行比较,而不是直接进行更新

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int w[20];
int dp[1<<20];//最少趟数
int remain[1<<20];//最后一趟还能载多重
int main(){
    int n,x;cin>>n>>x;
    for (int i=0;i<n;i++)
    cin>>w[i];
    memset(dp,0x3f,sizeof(dp));
    dp[0]=0,remain[0]=0;
    for (int mask=0;mask<(1<<n);mask++){
        for (int i=0;i<n;i++){
            if(mask&(1<<i))
            continue;
            int current=mask|(1<<i);
            int tdp,tremain;
            if(remain[mask]>=w[i]){
                tdp=dp[mask];
                tremain=remain[mask]-w[i];
            }
            else{
                tdp=dp[mask]+1;
                tremain=x-w[i];
            }
            if(tdp<dp[current]||(tdp==dp[current]&&tremain>remain[current])){
                dp[current]=tdp;
                remain[current]=tremain;
            }
        }
    }
    cout<<dp[(1<<n)-1];
}
相关推荐
A_nanda4 小时前
c# MOdbus rto读写串口,如何不相互影响
算法·c#·多线程
代码雕刻家6 小时前
2.4.蓝桥杯-分巧克力
算法·蓝桥杯
Ulyanov6 小时前
顶层设计——单脉冲雷达仿真器的灵魂蓝图
python·算法·pyside·仿真系统·单脉冲
智者知已应修善业7 小时前
【查找字符最大下标以*符号分割以**结束】2024-12-24
c语言·c++·经验分享·笔记·算法
91刘仁德8 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
diediedei8 小时前
模板编译期类型检查
开发语言·c++·算法
阿杰学AI8 小时前
AI核心知识78——大语言模型之CLM(简洁且通俗易懂版)
人工智能·算法·ai·语言模型·rag·clm·语境化语言模型
mmz12078 小时前
分治算法(c++)
c++·算法
睡一觉就好了。8 小时前
快速排序——霍尔排序,前后指针排序,非递归排序
数据结构·算法·排序算法
Tansmjs9 小时前
C++编译期数据结构
开发语言·c++·算法