hdu 2639 Bone Collector II (0/1背包)

简介: 点击打开链接hdu 2639 思路: 0/1背包求第k优解 分析: 1 其基本思想是,将每个状态都表示成有序队列,将状态转移方程中的 max/min 转 化成有序队列的合并。

点击打开链接hdu 2639

思路: 0/1背包求第k优解
分析:
1 其基本思想是,将每个状态都表示成有序队列,将状态转移方程中的 max/min 转 化成有序队列的合并。
2 这里仍然以 01 背包为例讲解一下。
   首先看 01 背包求最优解的状态转移方程: F [i, v] = max{F [i − 1, v], F [i − 1, v −Ci ] + Wi }。如果要求第 K 优解,那么状态 F [i, v] 就应该是一个大小为 K 的队列F [i, v, 1 . . . K]。其中 F [i, v, k] 表示前 i 个物品中,背包大小为 v 时,第 k 优解的值。这里也可以简单地理解为在原来的方程中加了一维来表示结果的优先次序。显然f [i, v, 1 . . . K] 这 K 个数是由大到小排列的,所以它可看作是一个有序队列。然后原方程就可以解释为: F [i, v] 这个有序队列是由 F [i − 1, v] 和 F [i − 1,v −Ci ] + Wi 这两个有序队列合并得到的。前者 F [i − 1][V ] 即 F [i − 1, v, 1 . . . K],后者F [i − 1,v − Ci ] + Wi 则理解为在 F[i − 1,v − Ci , 1 . . . K] 的每个数上加上 Wi 后得到的有序队列。合并这两个有序队列并将结果的前 K 项储存到 f [i, v, 1 . . . K] 中的复杂度是O(K)。最后的第 K 优解的答案是 F [N, V, K]。总的时间复杂度是 O(V N K)。
3 这边的难点就是在于合并,但是只要懂得了归并排序的这边都不难理解,还有要注意的一个地方就是题目说了把相同的值看成是一样的,所以这边的1~k的值是严格的递减,在合并的时候注意

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAX = 110;
const int MAXN = 1010;

int n , sumv , k;
int v[MAX] , w[MAX] , dp[MAXN][MAX];

int solve(){
    int arrOne[MAX] , arrTwo[MAX];
    memset(dp , 0 , sizeof(dp));
    for(int i = 1 ; i <= n ; i++){
        for(int j = sumv ; j >= v[i] ; j--){
            for(int cnt = 1 ; cnt <= k ; cnt++){
                arrOne[cnt] = dp[j][cnt]; 
                arrTwo[cnt] = dp[j-v[i]][cnt]+w[i]; 
            }
            int a , b , c;
            a = b = c = 1;
            // 归并排序
            while(c <= k && a <= k && b <= k){
                 if(arrOne[a] > arrTwo[b]) 
                     dp[j][c] = arrOne[a++];
                 else
                     dp[j][c] = arrTwo[b++];
                 // 注意值相同的算一个
                 if(dp[j][c] != dp[j][c-1])
                     c++;
            }
            while(a <= k && c <= k){
                dp[j][c] = arrOne[a++];
                // 注意值相同的算一个
                if(dp[j][c-1] != dp[j][c])
                    c++;
            }
            while(b <= k && c <= k){
                dp[j][c++] = arrTwo[b++];
                // 注意值相同的算一个
                if(dp[j][c-1] != dp[j][c])
                    c++;
            }
        }
    }
    return dp[sumv][k];
}

int main(){
    int Case;
    scanf("%d" , &Case);
    while(Case--){
         scanf("%d%d%d" , &n , &sumv , &k); 
         for(int i = 1 ; i <= n ; i++)
             scanf("%d" , &w[i]);
         for(int i = 1 ; i <= n ; i++)
             scanf("%d" , &v[i]);
         printf("%d\n" , solve()); 
    }
    return 0;
}



目录
相关文章
|
监控 前端开发 Java
开发者学堂课程干货总结——Spring Boot 2.5.x开发实战(八)
Spring Boot 2.5.x开发实战课时8——Spring Boot 2.5实战API帮助文档Swagger,Spring Boot 2.5.x开发实战是学习Java Spring Cloud微服务架构的必经之路。电子书+视频为同学带来最佳学习效果,文字、课程链接、图谱地址统统为大家放送了哦
开发者学堂课程干货总结——Spring Boot 2.5.x开发实战(八)
|
新零售 安全 固态存储
CDN新品发布:阿里云SCDN安全加速开放公测
SCDN(Secure+CDN)安全加速产品是CDN推出的一款集合安全能力的内容加速服务,用户就近取得所需内容解决因分布、带宽、服务器性能带来的访问延迟问题,提升网站访问速度。同时防护DDoS,CC,Web应用攻击,恶意刷流量,恶意爬虫等危害网站的行为。
7084 0
希望OFFICE有一个小阳台,在阳光斜照的下午,开发人员能喝着茶,在蓝色的天空下讨论问题,这样思绪更为清楚
希望OFFICE有一个小阳台,在阳光斜照的下午,开发人员能喝着茶,在蓝色的天空下讨论问题,这样思绪更为清楚
|
9天前
|
人工智能 运维 安全
|
7天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
689 23
|
8天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
14天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
1122 110