初识分治法,动态规划——中位数,Gray码与零钱问题
2007-04-15 17:31
260 查看
通过学习“算法设计与分析”课程,我想对于那些经典的算法,除了在理论上“认识”他们外,最主要是在思想上学会他们,接受他们,这样不知不觉地培养了我们一种严密的思维能力,并且运用所学知识结合具体问题设计适用的算法的能力。而且那些经典算法也有很多复杂的应用领域,但是对于没有涉足这方面的人来说,由“认识”他们再上升到算法思想上的掌握也是很有必要的。
下面介绍的几个应用例子都是相对来说不是很难的,主要是先有一种感性的认识。
有关分治法思想
分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以: 1) 把它分成两个或多个更小的问题;
2) 分别解决每个小问题;
3) 把各小问题的解答组合起来,即可得到原问题的解答。
小问题通常与原问题相似,可以递归地使用分而治之策略来解决。
中位数问题
问题的提出
对于两个长度均为n的已排序的序列,确定这两个序列的2n个元素的中位数
解决此问题的算法思想
设两个长度为n的数列分别为x[ 0 : n -1]和y[ 0 : n -1],分别找出这两个数列的中位数x[i]和
y[ j ],二者进行比较,根据比较结果可以在每个数列中减少一半的搜索范围,然后再分别取
两个子数列的中位数再比较,再减少搜索范围,继续下去直到找到最后结果
求解过程
查找范围确定:
当n为奇数时,令n=2m +1,则两个数列的中位数分别为x[ m ]和 y[ m ],则:
x[0:m-1]<x[m]<x[m+1:2m]和
y[0:m-1]<y[m]<y[m+1:2m]
若 x[m]<y[m]
若整体中位数x[k]在x[0:m-1]中,则
x[k]<x[m]<x[m+1:2m]且 x[k]<y[m]<y[m+1:2m]
则x[k]至少小于2m+2即n+1个数,而整体的中位数应该是第n个数,它小于n个数,所以整体中位数不在x的前半部分,同样不会在y的后半部分。
x[m]至少小于n个数,y[m]至少大于n个数,所以这两个局部中位数都有可能成为整体中位数.
所以再次查找范围为x[m:2m]和y[0:m]
当n为偶数时,令n=2m ,则两个数列的中位数分别为x[ m-1 ]和 y[ m-1 ],则:
x[0:m-2]<x[m-1]<x[m:2m-1]和
y[0:m-2]<y[m-1]<y[m:2m-1]
若 x[m-1]<y[m-1]
若整体中位数x[k]在x[0:m-2]中,则
x[k]<x[m-1]<x[m:2m-1]且 x[k]<y[m-1]<y[m:2m-1]
则x[k]至少小于2m+1即n+1个数,而整体的中位数应该是第n个数,它小于n个数,所以整体中位数不在x的前半部分,同样不会在y的后半部分。
x[m-1]至少小于n+1个数,所以其不会成为整体中位数,y[m-1]至少大于n-1个数,所以它有可能成为整体中位数
所以再次查找范围为x[m:2m-1]和y[0:m-2]
举个例子:
x={10, 15, 16, 19, 24}
y={11, 17, 18, 20, 23}
x1={16, 19, 24} y1= {11, 17, 18 }
x2={16,19} y2={17,18}
x2={19} y2={17} ————出口,应单独处理
x={10, 15, 16, 19}
y={11, 17, 18, 20}
x1={16, 19} y1= {11, 17}
x2={16} y2={17}
mid=16
数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。
C++实现:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/cfd59dfed01a4d8bbc148303ce607fbb.gif)
#include <iostream>
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/84497afad94946d396ff3879edaabd96.gif)
#include <fstream>
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/0c972b7d15b64848a7827bccaf6c60cd.gif)
using namespace std;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/6ff0d42780cd4aa5a809e00d555de929.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/d47209fc19694ce1a1e0d8cb2ec12caa.gif)
int findMedian(int*, int*, int);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/86a9053f7fa24f4d9535e1f1c7220ff4.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5138bfb9fe8b49658293cca80ba6b412.gif)
int main()
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/96d9e23205a347549e847792f5d4daff.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/738fc176fdb445f8b71c00ff65017411.gif)
...{
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/c773f8beacb941cba3d0ab57a5223d16.gif)
ifstream in("in.txt");
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/b767108da9ad4311b1b8232f756c1984.gif)
ofstream out("d://out.txt");
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/8f23f96dd8d9462fa8d4b767cdfbb143.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/3ebd9eb5075e409694859657ea8db217.gif)
int n;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/c92c0a89a91f4d2eb2dd1c3d9c3ea85a.gif)
int *x,*y;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5d44f63f50714938996e55b43123dfec.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/c7fec0ec2ed74477bb7bbff158357b9e.gif)
in>>n;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/e6b4fb2d4f154c898d47f60efb39a72f.gif)
x=new int
;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/b75dc0adacad4efd863627236b6a2515.gif)
y=new int
;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/d8ff4892ebb7414ba2ce39c39ad6ee4f.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/a25aac1973eb44c696a9d6ae487f63ed.gif)
for(int i=0;i<n;i++)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/2a48d3c702aa44a9b41a2dcd47d36694.gif)
in>>x[i];
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/e8ea34d80ace45168f662bb9a1c608ff.gif)
for(i=0;i<n;i++)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/f705624a5b50419382628abd065c40c9.gif)
in>>y[i];
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/a61ae5dfd3d74159a0c6ea1989df474c.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/179187849a3f44289b3424fc6cf7f71c.gif)
int median=findMedian(x, y, n);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/a6e678b4911b4f57a014acb2cf453e4b.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5684b2910d024aa18c8f2bc8dfbcaab2.gif)
cout<<median<<endl;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/c6c8ad34bab64178b8a4914749dac04e.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/18945bae37154ae1b0c4f403764e22bb.gif)
out<<median;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/7420330285a048d69c6418d6334d50cf.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/ba917e385de04a3e9b4659acc0ea5996.gif)
in.close();
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5c14e91eda6c421bb94834e39f32e0c5.gif)
out.close();
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/6c70825930fe469988696aa162ed76b6.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5082892081a643d5aa02c85b2e39e5a6.gif)
return 1;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/045e30379b1c4e92b03566e43967d176.gif)
}
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/0733de72979149908b765b21fbd7158b.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/0ab54e97079049a1b7f2ecbf50b6d55b.gif)
int findMedian(int* x, int* y, int n)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/b66034a93dcc47eb89b8f2cb823a4eb6.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/deeade29d7e14912ab27ddfa1d6e00cc.gif)
...{
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/0477e5488c52413eaba3856ac9fc8245.gif)
if(n==1)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/e2ddaf90990445b1807e1668b124a420.gif)
return *x <= *y? *x:*y;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/186d7b8066404d429492b6bec414ff15.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/ed721de6f1144ef7990a59d8cdc7782b.gif)
int m=(n-1)/2; //中位数位置
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/91f10c79950346b3bc37594b4a547188.gif)
int p=m+1; //中位数小者子数字起始位置
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/b270537002724ff3b38ceea632ba9fdb.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/78bac30d4c6c45efb052c4b9d4aea935.gif)
if(n%2!=0) //n为奇数
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5f2e1695a69b465f826c36d78f831d5f.gif)
p--;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/1d4943f2b8264803b085dd50e891aa73.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/cc826adac63749c38e13f4e19f623378.gif)
if(*(x+m)==*(y+m))
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/7592c997b9c64cbe8338898395fb3001.gif)
return *(x+m);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/d7a37b1f5d2448f9be0fe8e8831f06fc.gif)
else if(*(x+m)(y+<*m))
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5b40d9410df04ac3863dceb442f46d38.gif)
return findMedian(x+p,y,m+1);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/7473b8eda1a648a5a5e4fa7478fd399f.gif)
else
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/7ef1cd389a884961b47ce8d97b21a048.gif)
return findMedian(x,y+p,m+1);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/807a15b286664160baac23e0300cd324.gif)
}
Gray码问题
Gray码是一个长度为2n的序列。序列中无相同的元素,每个 元素长度都为n位的串,相邻元素恰好之有一位不同,对任意的n位如何构造相应的Gray码。
对于n=4的Gray码,如下图所。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/910fdbd1439d46f8bad3e60664506509.png)
上图 第1列从最左边算起
实现这个问题的方法是,递归上半部分,下半部分对称复制上半分部即可
由文件input.txt提供输入数据n。
用C++ 实现:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <iostream>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <fstream>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <stdio.h>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <math.h>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
using namespace std;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
void Graycode( int a, int b, int ** arr)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//递归出口
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(a==1)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//处理当前列
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int i = 0; i < a/2 ; i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
arr[i][b-1] = 0;//上半部分赋值为0
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
arr[a-i-1][b-1]=1; //下半部分赋值为1
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//处理子问题
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Graycode(a/2,b-1,arr);//递归调用子问题,生成列数为b-1的Gray码,填写高半部分
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int k = a/2; k<a; k++)//将(n-1)位的Gray码逆序后,填入目标码字/的低半部分
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for( int j =0; j<b-1; j++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
arr[k][j]=arr[a-k-1][j];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int main()
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int n;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ifstream in("in.txt");
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ofstream out("d://out.txt");
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in>>n;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int row=pow(2,n);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int **arr=new int*[row];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(int m=0;m<row;m++)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
arr[m]=new int
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Graycode(row,n,arr);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int i=0;i<row;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int j=0;j<n;j++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
cout<<arr[i][j];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
cout<<endl;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in.close();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
out.close();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 1;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
有关动态规划的思想
零钱问题
设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱,可以实用的各种面值的硬币个数不限。当只用硬币面值T[1],T[2],…,T[i]时,可找出钱数j的最少硬币个数记为C(i,j)。若只用这些硬币面值,找不出钱数j时,记C(i,j)=∞:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/51491c7972704050a754150d41bb6b46.jpg)
« 数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=13),表示有n种硬币可选。接下来的一行是每种硬币的面值。由用户输入待找钱数j。
使用C++语言实现
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <fstream>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <iostream>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <algorithm>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
using namespace std;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int changeCoins(int *T, int n, int v);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int main()
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ifstream in("in.txt");
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ofstream out("d://out.txt");
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int n;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int v;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in>>n;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int *T=new int
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int i=0;i<n;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in>>T[i];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in>>v;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int result=changeCoins(T,n,v);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
cout<<result<<endl;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
out<<result;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in.close();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
out.close();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 1;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int changeCoins(int *T, int n, int v)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//先对3个硬币按面值进行排序
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
sort(T,T+n);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int **c=new int*
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(int m=0;m<n;m++)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[m]=new int[v+1];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//初始化第一行,只有一个硬币时的情况
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int i=0;i<=v;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(i%T[0]==0)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[0][i]=i/T[0];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
else
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[0][i]=INT_MAX;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//从第二行开始
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int j=1;j<n;j++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int k=0;k<=v;k++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//新加进来的硬币大于要找的钱,用不到这个硬币,所以还是跟上一行的一样
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(k<T[j])
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[j][k]=c[j-1][k];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
else
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[j][k]=c[j-1][k]<c[j][k-T[j]]+1?c[j-1][k]:c[j][k-T[j]]+1;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return c[n-1][v];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
delete[] c;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
下面介绍的几个应用例子都是相对来说不是很难的,主要是先有一种感性的认识。
有关分治法思想
分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以: 1) 把它分成两个或多个更小的问题;
2) 分别解决每个小问题;
3) 把各小问题的解答组合起来,即可得到原问题的解答。
小问题通常与原问题相似,可以递归地使用分而治之策略来解决。
中位数问题
问题的提出
对于两个长度均为n的已排序的序列,确定这两个序列的2n个元素的中位数
解决此问题的算法思想
设两个长度为n的数列分别为x[ 0 : n -1]和y[ 0 : n -1],分别找出这两个数列的中位数x[i]和
y[ j ],二者进行比较,根据比较结果可以在每个数列中减少一半的搜索范围,然后再分别取
两个子数列的中位数再比较,再减少搜索范围,继续下去直到找到最后结果
求解过程
查找范围确定:
当n为奇数时,令n=2m +1,则两个数列的中位数分别为x[ m ]和 y[ m ],则:
x[0:m-1]<x[m]<x[m+1:2m]和
y[0:m-1]<y[m]<y[m+1:2m]
若 x[m]<y[m]
若整体中位数x[k]在x[0:m-1]中,则
x[k]<x[m]<x[m+1:2m]且 x[k]<y[m]<y[m+1:2m]
则x[k]至少小于2m+2即n+1个数,而整体的中位数应该是第n个数,它小于n个数,所以整体中位数不在x的前半部分,同样不会在y的后半部分。
x[m]至少小于n个数,y[m]至少大于n个数,所以这两个局部中位数都有可能成为整体中位数.
所以再次查找范围为x[m:2m]和y[0:m]
当n为偶数时,令n=2m ,则两个数列的中位数分别为x[ m-1 ]和 y[ m-1 ],则:
x[0:m-2]<x[m-1]<x[m:2m-1]和
y[0:m-2]<y[m-1]<y[m:2m-1]
若 x[m-1]<y[m-1]
若整体中位数x[k]在x[0:m-2]中,则
x[k]<x[m-1]<x[m:2m-1]且 x[k]<y[m-1]<y[m:2m-1]
则x[k]至少小于2m+1即n+1个数,而整体的中位数应该是第n个数,它小于n个数,所以整体中位数不在x的前半部分,同样不会在y的后半部分。
x[m-1]至少小于n+1个数,所以其不会成为整体中位数,y[m-1]至少大于n-1个数,所以它有可能成为整体中位数
所以再次查找范围为x[m:2m-1]和y[0:m-2]
举个例子:
x={10, 15, 16, 19, 24}
y={11, 17, 18, 20, 23}
x1={16, 19, 24} y1= {11, 17, 18 }
x2={16,19} y2={17,18}
x2={19} y2={17} ————出口,应单独处理
x={10, 15, 16, 19}
y={11, 17, 18, 20}
x1={16, 19} y1= {11, 17}
x2={16} y2={17}
mid=16
数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。
输入文件示例 | 输出文件示例 |
input.txt | output.txt |
3 5 15 18 3 14 21 | 14 |
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/cfd59dfed01a4d8bbc148303ce607fbb.gif)
#include <iostream>
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/84497afad94946d396ff3879edaabd96.gif)
#include <fstream>
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/0c972b7d15b64848a7827bccaf6c60cd.gif)
using namespace std;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/6ff0d42780cd4aa5a809e00d555de929.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/d47209fc19694ce1a1e0d8cb2ec12caa.gif)
int findMedian(int*, int*, int);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/86a9053f7fa24f4d9535e1f1c7220ff4.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5138bfb9fe8b49658293cca80ba6b412.gif)
int main()
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/96d9e23205a347549e847792f5d4daff.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/738fc176fdb445f8b71c00ff65017411.gif)
...{
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/c773f8beacb941cba3d0ab57a5223d16.gif)
ifstream in("in.txt");
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/b767108da9ad4311b1b8232f756c1984.gif)
ofstream out("d://out.txt");
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/8f23f96dd8d9462fa8d4b767cdfbb143.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/3ebd9eb5075e409694859657ea8db217.gif)
int n;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/c92c0a89a91f4d2eb2dd1c3d9c3ea85a.gif)
int *x,*y;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5d44f63f50714938996e55b43123dfec.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/c7fec0ec2ed74477bb7bbff158357b9e.gif)
in>>n;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/e6b4fb2d4f154c898d47f60efb39a72f.gif)
x=new int
;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/b75dc0adacad4efd863627236b6a2515.gif)
y=new int
;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/d8ff4892ebb7414ba2ce39c39ad6ee4f.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/a25aac1973eb44c696a9d6ae487f63ed.gif)
for(int i=0;i<n;i++)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/2a48d3c702aa44a9b41a2dcd47d36694.gif)
in>>x[i];
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/e8ea34d80ace45168f662bb9a1c608ff.gif)
for(i=0;i<n;i++)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/f705624a5b50419382628abd065c40c9.gif)
in>>y[i];
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/a61ae5dfd3d74159a0c6ea1989df474c.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/179187849a3f44289b3424fc6cf7f71c.gif)
int median=findMedian(x, y, n);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/a6e678b4911b4f57a014acb2cf453e4b.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5684b2910d024aa18c8f2bc8dfbcaab2.gif)
cout<<median<<endl;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/c6c8ad34bab64178b8a4914749dac04e.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/18945bae37154ae1b0c4f403764e22bb.gif)
out<<median;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/7420330285a048d69c6418d6334d50cf.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/ba917e385de04a3e9b4659acc0ea5996.gif)
in.close();
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5c14e91eda6c421bb94834e39f32e0c5.gif)
out.close();
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/6c70825930fe469988696aa162ed76b6.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5082892081a643d5aa02c85b2e39e5a6.gif)
return 1;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/045e30379b1c4e92b03566e43967d176.gif)
}
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/0733de72979149908b765b21fbd7158b.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/0ab54e97079049a1b7f2ecbf50b6d55b.gif)
int findMedian(int* x, int* y, int n)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/b66034a93dcc47eb89b8f2cb823a4eb6.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/deeade29d7e14912ab27ddfa1d6e00cc.gif)
...{
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/0477e5488c52413eaba3856ac9fc8245.gif)
if(n==1)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/e2ddaf90990445b1807e1668b124a420.gif)
return *x <= *y? *x:*y;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/186d7b8066404d429492b6bec414ff15.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/ed721de6f1144ef7990a59d8cdc7782b.gif)
int m=(n-1)/2; //中位数位置
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/91f10c79950346b3bc37594b4a547188.gif)
int p=m+1; //中位数小者子数字起始位置
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/b270537002724ff3b38ceea632ba9fdb.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/78bac30d4c6c45efb052c4b9d4aea935.gif)
if(n%2!=0) //n为奇数
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5f2e1695a69b465f826c36d78f831d5f.gif)
p--;
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/1d4943f2b8264803b085dd50e891aa73.gif)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/cc826adac63749c38e13f4e19f623378.gif)
if(*(x+m)==*(y+m))
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/7592c997b9c64cbe8338898395fb3001.gif)
return *(x+m);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/d7a37b1f5d2448f9be0fe8e8831f06fc.gif)
else if(*(x+m)(y+<*m))
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/5b40d9410df04ac3863dceb442f46d38.gif)
return findMedian(x+p,y,m+1);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/7473b8eda1a648a5a5e4fa7478fd399f.gif)
else
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/7ef1cd389a884961b47ce8d97b21a048.gif)
return findMedian(x,y+p,m+1);
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/807a15b286664160baac23e0300cd324.gif)
}
Gray码问题
Gray码是一个长度为2n的序列。序列中无相同的元素,每个 元素长度都为n位的串,相邻元素恰好之有一位不同,对任意的n位如何构造相应的Gray码。
对于n=4的Gray码,如下图所。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/910fdbd1439d46f8bad3e60664506509.png)
上图 第1列从最左边算起
实现这个问题的方法是,递归上半部分,下半部分对称复制上半分部即可
由文件input.txt提供输入数据n。
用C++ 实现:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <iostream>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <fstream>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <stdio.h>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <math.h>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
using namespace std;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
void Graycode( int a, int b, int ** arr)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//递归出口
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(a==1)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//处理当前列
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int i = 0; i < a/2 ; i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
arr[i][b-1] = 0;//上半部分赋值为0
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
arr[a-i-1][b-1]=1; //下半部分赋值为1
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//处理子问题
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Graycode(a/2,b-1,arr);//递归调用子问题,生成列数为b-1的Gray码,填写高半部分
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int k = a/2; k<a; k++)//将(n-1)位的Gray码逆序后,填入目标码字/的低半部分
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for( int j =0; j<b-1; j++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
arr[k][j]=arr[a-k-1][j];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int main()
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int n;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ifstream in("in.txt");
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ofstream out("d://out.txt");
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in>>n;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int row=pow(2,n);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int **arr=new int*[row];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(int m=0;m<row;m++)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
arr[m]=new int
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Graycode(row,n,arr);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int i=0;i<row;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int j=0;j<n;j++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
cout<<arr[i][j];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
cout<<endl;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in.close();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
out.close();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 1;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
有关动态规划的思想
零钱问题
设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱,可以实用的各种面值的硬币个数不限。当只用硬币面值T[1],T[2],…,T[i]时,可找出钱数j的最少硬币个数记为C(i,j)。若只用这些硬币面值,找不出钱数j时,记C(i,j)=∞:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/51491c7972704050a754150d41bb6b46.jpg)
« 数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=13),表示有n种硬币可选。接下来的一行是每种硬币的面值。由用户输入待找钱数j。
使用C++语言实现
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <fstream>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <iostream>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include <algorithm>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
using namespace std;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int changeCoins(int *T, int n, int v);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int main()
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ifstream in("in.txt");
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ofstream out("d://out.txt");
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int n;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int v;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in>>n;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int *T=new int
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int i=0;i<n;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in>>T[i];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in>>v;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int result=changeCoins(T,n,v);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
cout<<result<<endl;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
out<<result;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
in.close();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
out.close();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 1;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int changeCoins(int *T, int n, int v)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//先对3个硬币按面值进行排序
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
sort(T,T+n);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int **c=new int*
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(int m=0;m<n;m++)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[m]=new int[v+1];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//初始化第一行,只有一个硬币时的情况
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int i=0;i<=v;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(i%T[0]==0)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[0][i]=i/T[0];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
else
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[0][i]=INT_MAX;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//从第二行开始
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int j=1;j<n;j++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(int k=0;k<=v;k++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
//新加进来的硬币大于要找的钱,用不到这个硬币,所以还是跟上一行的一样
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(k<T[j])
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[j][k]=c[j-1][k];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
else
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
c[j][k]=c[j-1][k]<c[j][k-T[j]]+1?c[j-1][k]:c[j][k-T[j]]+1;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return c[n-1][v];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
delete[] c;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
相关文章推荐
- 动态规划——找零钱问题 收藏
- 动态规划找零钱问题
- 求换取零钱的最少金币个数个数--动态规划问题2
- 动态规划-背包问题、兑换零钱问题、旅行商问题
- 动态规划——找零钱问题
- 动态规划之找零钱问题
- 动态规划--零钱问题
- 动态规划解决找零钱问题
- POJ 1276 取款机零钱组合问题 动态规划
- 动态规划 找零钱问题
- POJ 1276 取款机零钱组合问题 动态规划
- 【动态规划】换零钱问题用一维动态规划解决,没有数量限制可以用一维
- 动态规划解决找零钱问题
- 动态规划系列(2)——找零钱问题
- c++动态规划解决硬币换零钱的问题
- 【动态规划】—找零钱问题
- 动态规划——矩阵连乘的问题
- 1083 矩阵取数问题(动态规划)
- 利用动态规划解决连乘问题
- SDUT 3014 硬币问题 (动态规划) -- 解题报告