问题简述:现有一个m行n列的平面网格,{a(i,j)}代表各个位置的权重。现有k种不同面值的硬币,面值分别是 b(1),b(2),...,b(k)(各不相同),硬币的个数分别是
d(1),d(2),...,d(k),d(1)+d(2)+...+d(k)(记做d)不超过m*n。问:在保证相同面值的硬币位置相邻(某一位置至多4个相邻位置,对角线不算相邻)的条件下,如何安排这d个硬币的位置,使得
所有位置的指标(a(i,j)*[a(i,j)位置处放置的硬币的面值])之和(记做S)
最小?
补:(1)如果某一位置没有硬币,则 该位置处硬币的面值=0;
(2)如果没有办法找到最优解,使S尽可能地小也可以,但必须保证相同面值的硬币位置相邻。
d(1),d(2),...,d(k),d(1)+d(2)+...+d(k)(记做d)不超过m*n。问:在保证相同面值的硬币位置相邻(某一位置至多4个相邻位置,对角线不算相邻)的条件下,如何安排这d个硬币的位置,使得
所有位置的指标(a(i,j)*[a(i,j)位置处放置的硬币的面值])之和(记做S)
最小?
补:(1)如果某一位置没有硬币,则 该位置处硬币的面值=0;
(2)如果没有办法找到最优解,使S尽可能地小也可以,但必须保证相同面值的硬币位置相邻。
解决方案 »
- 诡异现象:程序中有三处(ABC)地方弹出不同的对话框。如果不先弹出A,则C无法弹出,B没有这个效果。
- 求大虾,这里能实现不?
- SDI与Dialog相比,该使用哪一个
- 怎么知道一个已创建的SOCKET邦定了哪个端口?
- 工程里面添加其他头文件,是不是一定要把头文件,拷贝到当前工程目录里面?
- 得到本地机器码的api是什么?
- 请问有办法看到MFC的源程序吗?
- 我给你还不行吗?不要让我失望了
- 第一次点菜单的open打开一个数据文件时,会自动调用CXjjDoc::Serialize(CArchive& ar),但当我回过头来第二次打开同一个文件时,调试跟踪标明不能进入CXjjDoc::Serialize(CArchive& ar),为什么呢?
- 各位大侠救命啊!我的updata()隔一会老出错!
- 紧急求助:哪能找到免费的ActiveX的数字签名啊.谢谢
- Attach 函数是做什么的好象用的很多!
假设放入d(1),d(2),...,d(k)已经是最小了。那么从d(1),d(2),...,d(k)中取出一个d(i),同时所有d(i)的权值和为最大。那么剩下的k-1种硬币在网格中的放置也是最小的。依次类推,我们可以知道最后剩下的d(j)在网格中的放置
也是最小的。由此,可以得出思路,从k个d(1),d(2),...,d(k)中选取一个d(i)放入让他最小,然后依次放入其他的并让他在剩余的网格中最小,就可以
得到整体的最小放置办法。
这样问题化解为放入k个面值相同的硬币k<m*n并相邻,如何使其权值最小。
先让按大小排序,然后给出a(i,j)相邻矩阵,然后么,最笨的办法就是穷举
了。
如果第一个放在(k,j),那么第二个只能在(k-1,j),(k,j-1),(k+1,j),(k,j+1)中选了,其余类推
(2)最大的问题在于:有可能A和B的交换,不满足条件,B和C的交换,也不满足条件;但是,你把两次交换同时进行,就满足条件了!所以上面sun_is_shining(流云)提供的思路应该是不行的。
(2)最大的问题在于:有可能A和B的交换,不满足条件,B和C的交换,也不满足条件;但是,你把两次交换同时进行,就满足条件了!所以上面sun_is_shining(流云)提供的思路应该是不行的。