洛谷 P1441:砝码称重 ← bitset

【题目来源】
https://www.luogu.com.cn/problem/P1441

【题目描述】
现有 n 个砝码,重量分别为 ai,在去掉 m 个砝码后,问最多能称量出多少不同的重量(不包括 0)。
请注意,
砝码只能放在其中一边

【输入格式】
第 1 行为有两个整数 n 和 m,用空格分隔。
第 2 行有 n 个正整数 a1, a2, a3, …, an,表示每个砝码的重量。

【输出格式】
仅包括 1 个整数,为最多能称量出的重量数量。​​​​​​​

【输入样例】
3 1
1 2 2

【输出样例】
3

【样例说明】
在去掉一个重量为 2 的砝码后,能称量出 1, 2, 3 共 3 种重量。

【数据规模】
对于 20% 的数据,m=0。
对于 50% 的数据,m≤1。
对于 50% 的数据,n≤10。
对于 100% 的数据,n≤
20, m≤4,m<n,ai≤100

【算法分析】
● 最大可称重量为 n*ai=20*100=2000​​​​​​​。
● STL bitset 简介:https://blog.csdn.net/hnjzsyjyj/article/details/148285903
● STL bitset 优化‌
(1)使用 bitset<2005> 表示可称量重量集合,第 j 位为 1 表示重量 j 可达。
(2)s<<a[i] 表示所有当前可达重量加上砝码 a[i] 后的新重量。
(3)初始化 s[0]=1(重量 0 可达),遍历每个选中的砝码,执行 s|=s<<a[i] 更新可达重量。
(4)s.count()-1 统计非零重量数量。

【算法代码】

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

int n,m,ans,a[25];
bitset<2005> s;

void dfs(int pos,int cnt,int state){
    if(cnt==n-m){
        s.reset();
        s[0]=1;
        for(int i=0;i<n;i++){
        	if(state & (1<<i)) s|=s<<a[i];
		}            
        ans=max(ans,(int)s.count()-1);
        return;
    }
    if(pos==n) return;
    dfs(pos+1,cnt+1,state|(1<<pos)); //Select current weight.
    dfs(pos+1,cnt,state); //Don't select weights.
}

int main() {
    cin>>n>>m;
    for(int i=0; i<n; i++) cin>>a[i];

    dfs(0,0,0);
    cout<<ans<<endl;
    return 0;
}

/*
in:
3 1
1 2 2

out:
3
*/



【参考文献】
https://www.luogu.com.cn/problem/P1441
https://www.luogu.com.cn/problem/P2347
https://www.acwing.com/problem/content/3420/
https://blog.csdn.net/hnjzsyjyj/article/details/148315428
https://blog.csdn.net/hnjzsyjyj/article/details/148285903


 

内容概要:本文档介绍了一个多目标规划模型,该模型旨在优化与水资源分配相关的多个目标。它包含四个目标函数:最小化F1(x),最大化F2(x),最小化F3(x)和最小化F4(x),分别对应于不同的资源或环境指标。每个目标函数都有具体的数值目标,如F1的目标值为1695亿立方米水,而F2则追求达到195.54亿立方米等。此外,模型还设定了若干约束条件,包括各区域内的水量限制以及确保某些变量不低于特定百分比的下限。特别地,为了保证模型的有效性和合理性,提出需要解决目标函数间数据尺度不一致的问题,并建议采用遗传算法或其他先进算法进行求解,以获得符合预期的决策变量Xi(i=1,2,...,14)的结果。 适合人群:对数学建模、运筹学、水资源管理等领域感兴趣的科研人员、高校师生及从业者。 使用场景及目标:①适用于研究涉及多目标优化问题的实际案例,尤其是水资源分配领域;②帮助读者理解如何构建和求解复杂的多目标规划问题,掌握处理不同尺度数据的方法;③为从事相关工作的专业人士提供理论参考和技术支持。 阅读建议:由于文档涉及到复杂的数学公式和专业术语,在阅读时应先熟悉基本概念,重点关注目标函数的具体定义及其背后的物理意义,同时注意理解各个约束条件的设计意图。对于提到的数据尺度不一致问题,建议深入探讨可能的解决方案,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值