我想将基数为10的数字转换为特殊的基本形式,如下所示:
A * 2 ^ 2 + B * 3 ^ 1 + C * 2 ^ 0
A可以取值[0,1]
B可以取值[0,1,2]
C可以取值[0,1]
例如,数字8将是
1 * 2 ^ 2 + 1 * 3 + 1。
保证给定的数字可以转换为这个专门的基础系统。
我知道如何从这个基本系统转换回base-10,但我不知道如何从base-10转换为这个专用基础系统。
答案 0 :(得分:1)
简化您的“特殊基础”:
X = A * 4 + B * 3 + C
A E {0,1}
B E {0,1,2}
C E {0,1}
显然,可以表示的最大数字是4 + 2 * 3 + 1 = 11
要弄清楚如何获得A,B,C的值,你可以做以下两件事之一:
让我们先看看(1):
A B C X. 0 0 0 0 0 0 1 1 0 1 0 3 0 1 1 4 0 2 0 6 0 2 1 7 1 0 0 4 1 0 1 5 1 1 0 7 1 1 1 8 1 2 0 10 1 2 1 11
请注意,2
和9
无法在此系统中表达,而4
和7
会出现两次。事实上,对于给定的输入,您有多个可能的解决方案,这是一个暗示,没有一个非常强大的算法(除了查找表)来实现您想要的。所以你的表可能如下所示:
int A[] = {0,0,-1,0,0,1,0,1,1,-1,1,1};
int B[] = {0,0,-1,1,1,0,2,1,1,-1,2,2};
int C[] = {0,1,-1,0,2,1,0,1,1,-1,0,1};
然后查找A,B,C。如果A< 0,没有解决方案。
答案 1 :(得分:1)
简而言之,将每个基数(在您的示例中为2 ^ 2,3 ^ 1,2 ^ 0)视为项目的权重,将整数视为行李的容量。这个问题希望我们找到这些项目的组合,他们准确地填充了这个项目。
首先,这个问题是NP完全的。它与subset sum problem相同,也可以看作knapsack problem的衍生问题。
尽管如此,这个问题可以通过在O(nW)
时间内使用动态编程的伪多项式时间算法来解决,n
是基数,W
是要分解的数字。详细信息可在此维基百科页面中找到:http://en.wikipedia.org/wiki/Knapsack_problem#Dynamic_programming和此SO页面:What's it called when I want to choose items to fill container as full as possible - and what algorithm should I use?。