【发布时间】:2013-10-17 14:43:27
【问题描述】:
例如,有一个 4x4 整数数组,我需要从每一行中选择一个数字,以便每个选定的数字位于不同的列中,并且所选数字的总和尽可能低。有问题的网格如下所示:
1 2 3 1
2 3 1 3
2 2 1 2
3 4 1 9
我的程序返回这个答案:
1* 2 3 1
2 3* 1 3
2 2 1* 2
3 4 1 9*
但最好的解决方案是:
1 2 3 1*
2 3 1* 3
2* 2 1 2
3 1* 1 9
我需要对我的功能进行哪些更改?
struct r{
bool moze;
int quantity;
};
int ff,m1;
bool check(int n,r **tab, int k)
{
for(int i=0;i<n;i++){
if(tab[k][i].moze==true || tab[i][ff].moze==true)
return false;
}
return true;
}
bool back(int n, r ** tab, int k){
for(int i=0;i<n;i++){
if (check(n,tab,k)){
tab[k][i].moze=true;
if (k==n-1)
{
for(int j=0;j<n;j++)
{
for(int c=0;c<n;c++)
{
if(tab[j][k].moze==true)
cout<<tab[j][i].quantity;
}
}
return true;
}
if (back(n,tab,k+1))
return true;
else
tab[k][i].moze=false;
}
}
return false;
}
如何修复我的功能??
function mark(r, c, available):
for each element in [r][]:
mark available
for each element in [][c]:
mark available
function backtrack(table, temp, r, c, sum):
check if sum is solution
for row i in table:
if temp[i][0] is not available go to next row
for column j in table:
if temp[i][j] is available:
mark(i, j, not available)
backtrack(table, temp, i, j, sum+table[i][j])
mark(i, j, available again)
我有一个伪代码,但我不能把它放在我的函数中,有人可以帮助我吗,不能帮助自己
【问题讨论】:
-
你要做的是:首先考虑算法,然后实现它。不是相反。
-
为什么这个问题会被连续发布?这是我在过去三天里第五次看到它。
-
@Kunal 一定是某处的功课...
-
那么,这是什么,你已经第六次问这个问题了(我想你也问过其他人)?这样做不太可能让你得到答案。一方面,许多用户看到了所有/大部分这些问题,并因此立即对您产生负面影响。但主要原因是,如果你不改变太多,反应就不太可能改变。而是调查提出问题缺乏结果背后的原因。如果您删除您的问题,如果有人打算提供帮助,他们将无法这样做,因为它不再存在。
-
我看不出这个问题是怎么回事......除非你想复杂化。您可以做的一件事是将这个问题视为一个排列问题,使用
std::next_permutation,并且对于每个排列,检查乘法。不要忘记用最佳解决方案保持排列。
标签: c++ algorithm stl-algorithm