一、问题描述

描述

在一个操场的四周摆放着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编码变形—回溯法的更多相关文章

  1. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  2. 【数据压缩】Huffman编码

    1. 压缩编码概述 数据压缩在日常生活极为常见,平常所用到jpg.mp3均采用数据压缩(采用Huffman编码)以减少占用空间.编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射.数据压缩 ...

  3. Huffman编码实现电文的转码与译码

    //first thing:thanks to my teacher---chenrong      Dalian Maritime university /* 构造Huffman Tree思路: ( ...

  4. python 回溯法 子集树模板 系列 —— 19、野人与传教士问题

    问题 在河的左岸有N个传教士.N个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制: (1)修道士和野人都会划船,但船每次最多只能运M个人: (2)在任何岸边以及船上,野人数目都不 ...

  5. python 回溯法 子集树模板 系列 —— 17、找零问题

    问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元,要求硬币的个数最少,应该如何找零?或者指出该问题无解. 分析 元素--状态空间分析大法:四种面 ...

  6. python 回溯法 子集树模板 系列 —— 15、总结

    作者:hhh5460 时间:2017年6月3日 用回溯法子集树模板解决了这么多问题,这里总结一下使用回溯法子集树模板的步骤: 1.确定元素及其状态空间(精髓) 对每一个元素,遍历它的状态空间,其它的事 ...

  7. python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题

    问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...

  8. [老文章搬家] 关于 Huffman 编码

    按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...

  9. Huffman编码

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cstri ...

随机推荐

  1. JavaScript动态显示时间

    <body> <div></div> <script> var div = document.querySelector('div'); retNowT ...

  2. 在阿里云Ubuntu 14.04.5 LTS下安装nethogs0.8.5

    由于默认安装的nethogs不能使用,提示:Creating socket failed while establishing local IP - are you root? 搜索资料后检查当前版本 ...

  3. 华为云FusionInsight MRS:助力企业构建“一企一湖,一城一湖”

    摘要:华为云FusionInsight MRS新一代的数据湖,让大数据越用越快.越用越易.越用越稳.越用越省!让数据价值近在眼前! 10月30日,以"携手共赢·数创未来"为主题的第 ...

  4. jar文件无法双击打开

    1.  jdk安装后环境变量未设置好 (无jdk先自行下载) 我的电脑-属性-高级系统设置-环境变量-系统变量 找到path:添加环境变量为"java/jdk/bin"文件夹路径( ...

  5. C++函数四( 具有默认参数值的函数)

    在C++语言中,可以设置函数形参的默认值,在调用函数时,若明确给出了实参的值,则使用相应实参的值;若没有给出相应实参的值,则使用默认的值.这将为函数调用带来方便和灵活. [示例] #include&l ...

  6. AES的数学基础

    有限域 有限域上的运算 加法 两个多项式进行加法运算,就是两个多项式对应系数模2相加 乘法 两个多项式进行乘法运算:两个多项式相乘 若运算结果超过7次方,则必须对此结果进行一个多项式m(x)模运算,其 ...

  7. Flutter 开发从 0 到 1(五)源码

    Flutter 开发从 0 到 1 明天开始又要上班了,你的假期任务完成如何啊?由于平时加班太多了,实在挤不出更多时间,从开始想用 Flutter <Flutter 开发从 0 到 1(一)需求 ...

  8. 关于情感分类(Sentiment Classification)的文献整理

    最近对NLP中情感分类子方向的研究有些兴趣,在此整理下个人阅读的笔记(持续更新中): 1. Thumbs up? Sentiment classification using machine lear ...

  9. nice-ni 耗光cpu

    可以看到 低优先级的进程 暂用了比较高的CPU时间. top 命令中可以看到 NI 为19, 其优先级最低 但是使用cpu 最高. 说明这个进程需要经行优化了, 通过gdb 发现此进程一直都在处理报文 ...

  10. Selective Acknowledgment 选项 浅析 2

    来自:http://abcdxyzk.github.io/blog/2013/09/06/kernel-net-sack/ static int tcp_sacktag_write_queue(str ...