【动态规划】搭建双塔

探讨如何通过有限数量的水晶构建出具有相同高度的双塔,并解决由此带来的数学问题。涉及背包问题变形,实现双塔高度最大化的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述 Description 
   2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔。
  Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建。但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少。所以他来请你帮忙。
  给定水晶的数量N(1≤N≤100)和每块水晶的高度Hi(N块水晶高度的总和不超过2000),你的任务是判断Mr. F能否用这些水晶搭建成一座双塔(两座塔有同样的高度),如果能,则输出所能搭建的双塔的最大高度,否则输出“Impossible”。
   
   
 输入格式 Input Format 
   输入的第一行为一个数N,表示水晶的数量。第二行为N个数,第i个数表示第i个水晶的高度。
   
   
  输出格式 Output Format 
   输出仅包含一行,如果能搭成一座双塔,则输出双塔的最大高度,否则输出一个字符串“Impossible”。
   
   
  样例输入 Sample Input 
 
   
   
  样例输出 Sample Output 
 
   

 

 

 

 

来源 Source

 

 

某校NOIP模拟题

 

 

背包变形。传统背包加一维状态。

f[j1,j2]表示对于前i个水晶,能不能构成高度分别为j1,j2的塔

 

f[j1,j2]=f[j1-v[i],j2] or  f[j1,j2-v[i]] or(f[j1,j2])

 

最后从大到小枚举i,若f[i,i]=true 则输出i 结束程序

最后输出 ‘Impossible'

 

注意i的下界不是0而是1

 

注意输出 'impossible'

 

var i,j1,j2,n,max,s:longint;
    v:array[1..100]of longint;
    f:array[-1000..1000,-1000..1000]of boolean;
begin
    fillchar(f,sizeof(f),false);
    readln(n);
    for i:=1 to n do
    read(v[i]);s:=0;
    for i:=1 to n do s:=s+v[i];
    max:=s div 2;
    f[0,0]:=true;
    for i:=1 to n do
    for j1:=max downto 0 do
    for j2:=max downto 0 do
    f[j1,j2]:=(f[j1-v[i],j2])or(f[j1,j2-v[i]])or(f[j1,j2]);
    for i:=max downto 1 do
    if f[i,i] then
    begin
        writeln(i);
        exit;
    end;
    writeln('Impossible');
    readln;readln;
end.


 

### 双塔模型的定义及工作原理 双塔模型是一种经典的机器学习架构,在推荐系统和信息检索领域广泛应用。其核心思想是通过两个独立的子网络分别对用户和物品进行嵌入表示的学习,最终实现高效的相似度计算[^3]。 具体来说,双塔模型的工作流程如下: 1. **用户侧与物品侧特征提取** 用户侧会输入用户的属性数据(如历史行为、兴趣标签等),而物品侧则输入物品的内容特征(如文本描述、类别、创作者等)。这些原始特征会被送入各自的神经网络中进行处理。 2. **嵌入向量生成** 经过各自网络的多层变换后,用户和物品都会被映射成固定维度的低维稠密向量(即Embedding)。这一过程使得复杂的高维稀疏特征能够转化为易于比较的形式。 3. **相似度计算** 在得到两者的嵌入向量之后,通常采用余弦相似度或点积等方式来衡量它们之间的匹配程度。得分越高,则代表两者越接近于理想中的配对关系[^1]。 ```python import tensorflow as tf # 假设我们有用户和物品的embedding矩阵 user_embedding = tf.keras.layers.Dense(128, activation='relu')(user_input) item_embedding = tf.keras.layers.Dense(128, activation='relu')(item_input) # 计算相似度分数 (这里使用点积方式) similarity_score = tf.reduce_sum(user_embedding * item_embedding, axis=1) ``` --- ### 应用场景分析 双塔模型因其高效性和灵活性,适用于多种实际业务场景,主要包括但不限于以下几个方面: #### 推荐系统 在电商网站、视频平台以及新闻客户端上,双塔模型可以用来预测哪些商品/文章最可能吸引特定用户点击购买或阅读。它不仅考虑到了显式的交互记录,还引入了隐含的兴趣偏好表达[^2]。 #### 信息检索 搜索引擎利用此技术快速筛选出与查询意图最为相符的一批文档候选集。相比传统的倒排索引加BM25排名算法组合方案而言,基于深度学习构建出来的双塔结构往往能捕捉更深层次语义关联性[^4]。 #### 广告投放优化 广告主希望精准触达目标受众群体时,也可以借助此类框架完成定向推送任务。例如根据网民浏览习惯推测他们可能会感兴趣的产品类型并展示相应广告素材。 --- ### 示例说明 假设某短视频APP想要提升首页个性化Feed流体验效果,那么就可以搭建一套完整的双塔召回机制。对于每一个新上传的视频片段,先抽取它的元数据字段(封面图片URL链接地址字符串形式)、标题文字内容经过编码转换成为数值型数组;与此同时针对登录状态下的每位活跃会员账户档案资料同样做类似的数字化加工操作。最后再把这两部分结果投喂给预先训练好的双通道DNN模块当中运行推理运算得出预期收益概率值列表用于后续排序决策环节参考依据之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值