在穷举和动态规划之间的一种算法
写得点马虎,有错误再所难免,请见谅.
算法比较容易理解.
//作者:baihacker
//时间:1.12.2006
#include
using namespace std;
const MAX =30 ;//最大面值为30
int mark[MAX*5+1][5];
bool isexist(int row, int col)
{
int m, n, a, b;
for (m=1;m
for (a=1;a
{
if (m+a!=row)
continue;
for (n=0;n
for (b=0;b
{
if (n+b+2!=col+1)
continue;
if (mark[m][n]+mark[a][b] == 2)
return true;
}
}
return false;
}
void main()
{
int i, j;
int data[4]={1, 3, 7, 12};
int data1[5][4];
for (i=0;i<5;i++)
{
for (j=0;j<4;j++)
{
data1[i][j] = (i+1)*data[j];
}
}
for (i=1;i
{
for (j=0;j<5;j++)
{
if (data1[j][0] == i ||
data1[j][1] == i ||
data1[j][2] == i ||
data1[j][3] == i ||
data1[j][4] == i)
mark[i][j] = 1;
else
mark[i][j] = 0;
}
}
int t;
for (i=1;i
{
for (j=1;j<5;j++)//张数的循环
{
if (mark[i][j]==1)//已经有由j+1张组成i了
continue;
if (isexist(i, j))
mark[i][j] = 1;
}
t = mark[i][0]+mark[i][1]+mark[i][2]+mark[i][3]+mark[i][4];
if (t==0)//i不能被组合出,退出
{
cout<
break;
}
}
}