P1858 多人背包

题目描述

求01背包前k优解的价值和

输入输出格式

输入格式:

第一行三个数K、V、N

接下来每行两个数,表示体积和价值

输出格式:

前k优解的价值和

输入输出样例

输入样例#1: 
2 10 5
3 12
7 20
2 4
5 6
1 1
输出样例#1: 
57

说明

对于100%的数据, K≤50,V≤5000,N≤200

 

Solution:

  本题由于需要求前$k$个最优解的和。

   那么我们在普通的$0/1$背包状态上再加一维,设$f[i][j]$表示装了$i$容量时第$j$大的解,初始化$-inf$,初状态$f[0][1]=0$表示容量为$0$时最大的解为$0$。

   在枚举状态时,记录下当前决策转移后的前$k$大的解,并用其更新$f$,采用归并排序的思路去维护就$OK$啦。

  (这个讲不清白,需结合代码自行思考理解!)

代码:

 

#include<bits/stdc++.h>
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define Max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=5005;
int n,k,m,w[205],v[205],f[N][55],ans;
int main(){
    ios::sync_with_stdio(0);
    memset(f,128,sizeof(f));f[0][1]=0;
    cin>>k>>m>>n;
    For(i,1,n)cin>>v[i]>>w[i];
    For(i,1,n) Bor(j,v[i],m){    
        int c[55],l=0;
        for(int p=1,q=1;p+q<=k+1;){
            if(f[j][p]>f[j-v[i]][q]+w[i])c[++l]=f[j][p++];
            else c[++l]=f[j-v[i]][q++]+w[i];
        }
        For(p,1,k)f[j][p]=c[p];
    }
    For(i,1,k)ans+=f[m][i];
    cout<<ans;
    return 0;
}

 

 

 

 

转载于:https://www.cnblogs.com/five20/p/9048590.html

内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合群:具备嵌入式系统开发经验的研发员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
### 部分背包问题的解决方案 对于部分背包问题,贪心算法是一种有效的求解方法[^1]。此算法的核心在于每次选择单位重量价值最大的物品放入背包中,直到无法继续装载为止。 具体来说,在处理部分背包问题时,首先计算每种商品的价值密度(即单位重量下的价值),并按照这个比率降序排列这些商品。接着依次选取当前列表中最优的商品加入到背包里,如果该商品可以完全装入则全部取走;若不能,则尽可能地拿取一部分,直至达到容量上限或无更可选品项。 以下是基于上述思路的部分背包问题Python实现: ```python def fractional_knapsack(value, weight, capacity): """Calculate the maximum value of items that can be carried within given knapsack's capacity. Args: value (list): A list containing values associated with each item. weight (list): A list indicating weights corresponding to respective items. capacity (int or float): Total carrying limit for selected items. Returns: tuple: Maximum achievable total_value and detailed selection results as a dictionary mapping from index to proportion taken. """ # Indexes are used later on when sorting does not preserve original order information indexed_items = [(v / w, v, w, i) for i, (v, w) in enumerate(zip(value, weight))] # Sort by decreasing order based upon unit price ratio sorted_items = sorted(indexed_items, key=lambda x: x[0], reverse=True) max_total_value = 0 selections = {i: 0 for i in range(len(value))} for _, val, wt, idx in sorted_items: if capacity >= wt: max_total_value += val selections[idx] = 1 capacity -= wt elif capacity > 0: fraction = capacity / wt max_total_value += val * fraction selections[idx] = fraction break return round(max_total_value, ndigits=2), dict(sorted(selections.items())) # Example usage: values = [60, 100, 120] weights = [10, 20, 30] capacity = 50 result = fractional_knapsack(values, weights, capacity) print(f"The maximal obtainable value is {result[0]} using proportions:", result[1]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值