多元Huffman编码变形—回溯法
一、问题描述
描述
在一个操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定在合并过程中最多可以有m(k)次选k堆石子合并成新的一堆,2≤k≤n,合并的费用为新的一堆的石子数。试设计一个算法,计算出将n堆石子合并成一堆的最小总费用。 对于给定n堆石子,计算合并成一堆的最小总费用。
输入
输入数据的第1 行有1 个正整数n(n≤100),表示有n 堆石子。第2行有n个数,分别表示每堆石子的个数。第3 行有n-1 个数,分别表示m(k)(2≤k≤n)的值。
输出Output
将计算出的最小总费用输出。问题无解时输出“No solution!”
Sample Input
7
45 13 12 16 9 5 22
3 3 0 2 1 0
Sample Output
136
问题分析
- 首先用分支界限法(回溯法)找出每次合并石子堆数和可用次数
v[i] - 然后对石子从小到大排序,每次取最小堆数合并石子(这样保证越往后合并的堆数就越多)
- 这样就就可以保证最小输出
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int p[201];
int m[101];
int v[101];
/**
分支界限法 找出每次合并石子堆数和可用次数
参数:第i次合并,还剩余sum堆石子
*/
bool branch(int i,int sum){
if(i==1){
if(sum==1)
return true;
else
return false;
}
for(int j=m[i];j>=0;j--){
v[i] = j;
if(sum-v[i]*(i-1)<=0){
continue;
}
if(branch(i-1,sum-v[i]*(i-1))){
return true;
}
}
return false;
}
/**
把数组P中的第n-1个数据,插入到i到n-2数据里,
相当于把i到n从小到大排序
*/
void my_sorted(int i){
for (int j = n-1; j >= i; --j) {
if(p[j]<p[j-1]){
swap(p[j],p[j-1]);
}
else
break;
}
}
int main(){
cin>>n;
for (int i = 0; i < n; ++i) {
cin>>p[i];
}
for (int i = 2; i <= n; ++i) {
cin>>m[i];
}
//判断是否有解,并且把每次需要合并多少堆石子求出来
if(!branch(n,n)){
cout<<"No solution!"<<endl;
return 0;
}
sort(p,p+n);
// for(int i=0;i<=n;i++){
// cout<<v[i]<<' ';
// }
// cout<<endl;
int min = 0;
int start = 0;
int num = n;
for (int i = 1; i <= num;i++) {
for(int k = 0;k < v[i];k++){
int min2 = 0;
for (int j = 0; j < i; ++j) {
min2 += p[start++];
}
p[n++] = min2;
min += min2;
my_sorted(start);
}
}
cout<<min<<endl;
}
多元Huffman编码变形—回溯法的更多相关文章
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- 【数据压缩】Huffman编码
1. 压缩编码概述 数据压缩在日常生活极为常见,平常所用到jpg.mp3均采用数据压缩(采用Huffman编码)以减少占用空间.编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射.数据压缩 ...
- Huffman编码实现电文的转码与译码
//first thing:thanks to my teacher---chenrong Dalian Maritime university /* 构造Huffman Tree思路: ( ...
- python 回溯法 子集树模板 系列 —— 19、野人与传教士问题
问题 在河的左岸有N个传教士.N个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制: (1)修道士和野人都会划船,但船每次最多只能运M个人: (2)在任何岸边以及船上,野人数目都不 ...
- python 回溯法 子集树模板 系列 —— 17、找零问题
问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元,要求硬币的个数最少,应该如何找零?或者指出该问题无解. 分析 元素--状态空间分析大法:四种面 ...
- python 回溯法 子集树模板 系列 —— 15、总结
作者:hhh5460 时间:2017年6月3日 用回溯法子集树模板解决了这么多问题,这里总结一下使用回溯法子集树模板的步骤: 1.确定元素及其状态空间(精髓) 对每一个元素,遍历它的状态空间,其它的事 ...
- python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题
问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...
- [老文章搬家] 关于 Huffman 编码
按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...
- Huffman编码
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cstri ...
随机推荐
- 前端在开发过程中怎么提高网站的seo?
前端开发过程中怎么提高网站的seo? 到写这篇博客为止,我还没有做过需要做seo的项目,也不知道怎么前后端合作(我才毕业工作一年左右,往后会多去学习这方面知识的),通过一些配置来提高网站的seo性能. ...
- viewpager欢迎页面底部点的滑动效果
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo ...
- 合适的LoRa网关应该怎么选择
LoRa网关是什么 LoRa网关有时也被称之为lora基站或者lora集中器,它在lora星形组网中处于核心位置,是数据终端和服务器之间的一个信息桥梁.LoRa网关使用的是不同扩频因子,因为不同的扩频 ...
- Learn day10 锁
1.锁 # ### 锁 from multiprocessing import Lock,Process import json,time """ # 创建一把锁 loc ...
- 神州笔记本电脑【K670D】安装 Ubuntu18.04 系列操作
一.使用U盘安装 Ubuntu 前的处理如下: 进入BIOS将SSD设为启动首选项 -> F10保存退出 -> 用方向键高亮ubuntu启动项 -> 按e键进入编辑状态 -> ...
- CF1320C World of Darkraft: Battle for Azathoth
线段树 又是熟悉的感觉,又是E题写完了,没调完,不过还好上了紫 CF1295E 可以发现可以打败怪兽的关系类似二维偏序 那么首先考虑第一维(武器)以攻击值($a_{i}$)进行排序 把所有的怪兽以防御 ...
- .NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部?
奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了. 可奇怪的是我们的请求在运 ...
- 说说 C# 9 新特性的实际运用
你一定会好奇:"老周,你去哪开飞机了?这么久没写博客了." 老周:"我买不起飞机,开了个铁矿,挖了一年半的石头.谁知铁矿垮了,压死了几条蜈蚣,什么也没挖着." ...
- Magicodes.IE 3.0重磅设计畅谈
总体设计 Magicodes.IE导入导出通用库,支持Dto导入导出.模板导出.花式导出以及动态导出,支持Excel.Csv.Word.Pdf和Html. IE在去年年底重构一次之后,经过这么长时间的 ...
- Thinkphp3.2 cms之文章模块
二.文章模块 <?php namespace Admin\Controller; use Think\Controller; class NewController extends Common ...