免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: xiangsiyu21945
打印 上一主题 下一主题

有 A B C D E F G H I J K ... 等N个数 [复制链接]

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
11 [报告]
发表于 2012-04-28 11:17 |只看该作者
并不是所有的序列都有解啊,譬如:1,1,1,1,1还不如出一个算24点的题呢

论坛徽章:
0
12 [报告]
发表于 2012-04-28 12:33 |只看该作者
回复 10# koolcoy


    除以3 -> 除以9

    还有,lz明明说的是 “A B C ...” 所以不超过26个数啥也不用管啊

论坛徽章:
0
13 [报告]
发表于 2012-05-02 20:40 |只看该作者
hbmhalley 发表于 2012-04-28 12:33
回复 10# koolcoy
你这斯尽投机取巧

论坛徽章:
0
14 [报告]
发表于 2012-05-02 21:22 |只看该作者
xiangsiyu21945 发表于 2012-04-27 10:19
关键还包括了  AB + CD = E + F 这种类型,  1 ,2,3,4,4,6,  (  12 + 34 = 46)   ,现在 头都大了


这么复杂。。。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
15 [报告]
发表于 2012-05-03 10:58 |只看该作者
本帖最后由 starwing83 于 2012-05-03 11:13 编辑

这个题本身不满足最优化原则,我也没找到能满足最优化原则的预处理,估计是不能dp了,老实搜索吧……下面是Lua版本的:
  1. local function dfs(t, lim)
  2.     local len = #t
  3.     local function search_(i, lim, a, b)
  4.         if i == lim then return coroutine.yield(a+b) end
  5.         search_(i+1, lim, a+b, t[i+1])
  6.         search_(i+1, lim, a, b*10+t[i+1])
  7.     end
  8.     local function iter(i, lim, a, b)
  9.         return coroutine.wrap(function() return search_(i, lim, a, b) end)
  10.     end
  11.     local results = {}
  12.     for lv in iter(1, lim, 0, t[1]) do
  13.         results[lv] = true
  14.     end
  15.     for rv in iter(lim+1, len, 0, t[lim+1]) do
  16.         if results[rv] then
  17.             return rv
  18.         end
  19.     end
  20. end

  21. local function print_result(t, lim, result)
  22.     local function search_(i, lim, a, b, way)
  23.         if i == lim then
  24.             if a+b == result then coroutine.yield(way..b) end
  25.             return
  26.         end
  27.         search_(i+1, lim, a+b, t[i+1], way..b.." + ")
  28.         search_(i+1, lim, a, b*10+t[i+1], way)
  29.     end
  30.     local function iter(i, lim, a, b)
  31.         return coroutine.wrap(function() return search_(i, lim, a, b, "") end)
  32.     end
  33.     for wl in iter(1, lim, 0, t[1]) do
  34.         for wr in iter(lim+1, #t, 0, t[lim+1]) do
  35.             print(wl.." = "..wr)
  36.         end
  37.     end
  38. end

  39. local function sum(t, a, b)
  40.     local s = 0
  41.     for i = a, b do
  42.         s = s + t[i]
  43.     end
  44.     return s
  45. end

  46. local function solve(t)
  47.     local len = #t
  48.     for i = 1, len-1 do
  49.         if sum(t, 1, i)%3 == sum(t, i+1, len)%3 then
  50.             local res = dfs(t, i)
  51.             if res then
  52.                 print_result(t, i, res)
  53.             end
  54.         end
  55.     end
  56. end

  57. solve {1, 1, 1, 2, 2, 3, 6, 7}
复制代码
输出:
lua  -- "noname\2012-05-03-1.lua"
1 + 1 + 12 + 2 = 3 + 6 + 7
1 + 11 + 2 + 2 = 3 + 6 + 7
11 + 1 + 2 + 2 = 3 + 6 + 7
Hit any key to close this window...

这个是找所有解的,只求一个解的看着加break吧……

论坛徽章:
0
16 [报告]
发表于 2012-05-03 19:01 |只看该作者
回复 15# starwing83


    这个是lua代码?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
17 [报告]
发表于 2012-05-04 14:38 |只看该作者
回复 15# starwing83

不懂lua,没看那个代码。

1. 除以9取余的那个剪枝还是值得做的。
2. N稍微大一点,穷搜就不行: 把等号的位置放下后,剩下的每两个数字之间的加号可有可无,总共2^(N-2)总可能性,指数级的复杂度,穷搜显然不现实。
   

论坛徽章:
0
18 [报告]
发表于 2012-05-06 13:12 |只看该作者

没看出有啥很明显的polynomial time的算法 , 干脆把所有情况都做一下, 指数级别复杂度。  
几年没写过程序了, 纯粹练习下基本语法,循环。

  1. #include <iostream>
  2. #include <vector>
  3. #include <ctime>
  4. #include <cstdlib>
  5. using namespace std;

  6. vector<int> generateSample(int size) {
  7.     srand ( time(NULL) );
  8.     vector<int> sample(size);
  9.     for(int i=0; i < size; i++)
  10.         sample[i] = rand() % 9 + 1;
  11.     return sample;
  12. }

  13. void print(vector<int> vec) {
  14.         for(int i=0; i < vec.size(); i++)
  15.                 cout << vec[i] << " ";
  16.         cout << endl;
  17. }

  18. void print(vector<vector<int> > vec) {
  19.         for(int i = 0; i < vec.size(); i++)
  20.                 print(vec[i]);
  21. }

  22. void generateAllCombination_aux(vector<int> sample, vector<vector<int> > & allcomb) {
  23.         if (sample.size() == 1)
  24.                 allcomb.push_back(sample);
  25.         else {
  26.                 vector<int> sub(sample.begin(), sample.end());
  27.                 int tail = sub.back();
  28.                 sub.pop_back();
  29.                 generateAllCombination_aux(sub, allcomb);
  30.                 int currSize = allcomb.size();
  31.                 for(int i = 0; i < currSize; i++) {
  32.                         allcomb.push_back(allcomb[i]);
  33.                         int tmp = allcomb[currSize + i].back();
  34.                         allcomb[currSize + i].pop_back();
  35.                         allcomb[currSize + i].push_back(tmp*10 + tail);
  36.                         allcomb[i].push_back(tail);
  37.                 }
  38.         }
  39. }

  40. vector<vector<int> > generateAllCombination(vector<int> sample) {
  41.         vector<vector<int> > allcomb;
  42.         generateAllCombination_aux(sample, allcomb);
  43.         return allcomb;
  44. }

  45. int sum(vector<int> vec) {
  46.         int total = 0;
  47.         for(int i = 0; i < vec.size(); i++)
  48.                 total += vec[i];       
  49.         return total;
  50. }

  51. void printPlus(vector<int> vec) {
  52.         for(int i = 0; i < vec.size() - 1; i ++)
  53.                 cout << vec[i] << " + ";
  54.         cout << vec.back();
  55. }

  56. void solve(vector<vector<int> > left, vector<vector<int> > right) {
  57.         for(int i = 0; i < left.size(); i++)
  58.                 for(int j=0; j < right.size(); j++)
  59.                         if (sum(left[i]) == sum(right[j])) {
  60.                                 printPlus(left[i]);
  61.                                 cout << " = ";
  62.                                 printPlus(right[j]);
  63.                                 cout << endl;
  64.                         }
  65. }

  66. void solve(vector<int> sample) {
  67.         for (int pivot = 1; pivot < sample.size(); pivot++) {
  68.                 vector<int> left(sample.begin(), sample.begin() + pivot);
  69.                 vector<int> right(sample.begin() + pivot, sample.end());
  70.                 vector<vector<int> > leftAllComb = generateAllCombination(left);
  71.                 vector<vector<int> > rightAllComb = generateAllCombination(right);
  72.                 solve(leftAllComb, rightAllComb);
  73.         }
  74. }

  75. int main() {
  76.         vector<int> sample = generateSample(12);
  77.         cout << "sample : ";
  78.         print(sample);  
  79.         cout << endl;
  80.         solve(sample);  
  81.        
  82.         return 0;
  83. }

复制代码
min@min-PC ~/temp
$ ./a.exe
sample : 4 5 3 3 1 6 7 4 4 4 9 8

4 + 5 + 3 + 3 + 1 + 6 + 7 = 4 + 4 + 4 + 9 + 8
45 + 3 + 3 + 1 + 6 + 7 = 44 + 4 + 9 + 8
45 + 3 + 3 + 1 + 6 + 7 = 4 + 44 + 9 + 8
45 + 3 + 3 + 1 + 6 + 7 = 4 + 4 + 49 + 8
4 + 53 + 31 + 6 + 7 = 44 + 49 + 8
4 + 5 + 33 + 16 + 7 = 44 + 4 + 9 + 8
4 + 5 + 33 + 16 + 7 = 4 + 44 + 9 + 8
4 + 5 + 33 + 16 + 7 = 4 + 4 + 49 + 8
45 + 33 + 16 + 7 = 44 + 49 + 8
4 + 5 + 33 + 1 + 67 = 4 + 4 + 4 + 98
45 + 33 + 1 + 67 = 44 + 4 + 98
45 + 33 + 1 + 67 = 4 + 44 + 98
4 + 5 + 3 + 31 + 67 = 4 + 4 + 4 + 98
45 + 3 + 31 + 67 = 44 + 4 + 98
45 + 3 + 31 + 67 = 4 + 44 + 98

min@min-PC ~/temp
$ ./a.exe
sample : 9 8 1 3 2 2 5 9 7 4 8 4

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP