【发布时间】:2018-04-07 21:51:30
【问题描述】:
给定一个数字 S (int > 0) 和 n (int > 0),打印 len n 的所有不同子集,总和为 S。 对于 S = 7 和 n = 3,输出如下,输出必须是降序:
5 + 1 + 1
4 + 2 + 1
3 + 3 + 1
3 + 2 + 2
这是我迄今为止尝试过的:
vector<vector<int> > partitions(int X, int Y)
{
vector<vector<int> > v;
if (X <= 1 && X <= X - Y + 1)
{
v.resize(1);
v[0].push_back(X);
return v;
}
for (int y = min(X - 1, Y); y >= 1; y--)
{
vector<vector<int> > w = partitions(X - y, y);
for (int i = 0; i<w.size(); i++)
{
w[i].push_back(y);
v.push_back(w[i]);
}
}
return v;
}
int main()
{
vector<vector<int> > v = partitions(7, 3);
int i;
for (i = 0; i<v.size(); i++)
{
int x;
for (x = 0; x<v[i].size(); x++)
printf("%d ", v[i][x]);
printf("\n");
}
}
矩阵中的第一个元素是s-n+1并且满1直到和达到,或者如果s-n+1等于s,那么n为1,所以只有s会是解.
p.s : 不知道这个问题有没有特别的名字
【问题讨论】:
-
不要发布您尝试过的链接。在此处发布您的代码。另外:stackoverflow.com/help/mcve
-
好的,你能给我一个提示,一个想法或什么吗?
-
几乎所有的开发环境都带有调试软件,您可以使用它来控制程序的执行,如果需要,可以逐条指令执行,并允许您检查其状态(请参阅变量) .启动调试器。逐步执行该程序,直到您看到您没有预料到的程序。恭喜!你发现了一个错误。现在使用变量来找出程序做错事的原因。开始向后工作,以找出变量是如何设置为导致错误行为的值的。冲洗。重复。
标签: c++ algorithm dynamic-programming