急求>>简略的多元一次方程题,求任何一组解的算法

急求>>简单的多元一次方程题,求任何一组解的算法
请教大家给个简单的方法或思路,谢谢。

目前有一家自助餐馆的销售数据[每个账单的总钱数“含税”]:20.85 , 11.32 , 8.58 等等。
当前这家餐馆的收费一共有四种:成人(A)8.99/人,孩子(B)4.95/人,饮料(C)1.69/份,茶(D)0.5/份
当前餐馆的税率为:0.06.
问题就是:如何求得A,B,C,D的任意一组正数解?如:
20.85=(8.99*A+4.95*B+1.69*C+0.5*D)*1.06 =(8.99*2+4.95*0+1.69*1+0.5*0)*1.06 即一组解为:A=2,B=0,C=1,D=0


因为数据很多,所以需要写个程序处理一下,请各位指点迷津。谢谢。


------解决方案--------------------
解方程
------解决方案--------------------
可以这样,穷举出所有组合:

struct int_struct{int i1,i2,i3,i4};
map<float ,int_struct> mymap;
for(int i1 = 0;i1<100;i1++)
for(int i2 = 0;i2<100;i2++)
for(int i3 = 0;i3<100;i3++)
for(int i4 = 0;i4<100;i4++)
float key = (8.99*i1+4.95*i2+1.69*i3+0.5*i4)*1.06;
//将key,i1,i2,i3,i4对应关系保存起来,要用时直接查询即可
int_struct res1(i1,i2,i3,i4);
mymap[key] = res1;

当然还有别的更精确的办法
------解决方案--------------------
漏了大括号

struct int_struct{int i1,i2,i3,i4};
map<float ,int_struct> mymap;
for(int i1 = 0;i1<100;i1++)
for(int i2 = 0;i2<100;i2++)
for(int i3 = 0;i3<100;i3++)
for(int i4 = 0;i4<100;i4++)
{
float key = (8.99*i1+4.95*i2+1.69*i3+0.5*i4)*1.06;
//将key,i1,i2,i3,i4对应关系保存起来,要用时直接查询即可
int_struct res1(i1,i2,i3,i4);
mymap[key] = res1;
}

------解决方案--------------------
可以根据总和确定每个值大致的范围,份数又都是整数。确定了范围后用四重int循环,乘以系数后相加等于总和的值都是正数解
------解决方案--------------------
完全背包勉强可以解决这个问题
貌似线性规划更好
------解决方案--------------------
引用:
七楼的朋友,给点详细建议罢?谢谢。

就是完全背包嘛
只是得把这里的小数*100转成整数用背包
线性规划我不太确认,只是感觉可以
总费用扣掉税后就是物品本身的价值
问题可以转换成 
物品的费用和价值都是物品的价值
那么在给定的费用时看看能获得的最大价值是不是等于给定的费用
本题中应该是肯定有的,那么最大价值就是的了
楼主自己先搜搜完全背包
------解决方案--------------------

#include <stdio.h>
#include <stdlib.h>
/*
*功能:回代求解(针对上三角形矩阵)
*参数:matrix上三角阵,line矩阵行数
*返回值:解
*/
float *substitUpMethod(float **matrix, int line)
{
float *result, tmp;
int i, j;
for(i=0; i<line; ++i)
{
if(matrix[i][i] == 0)
{
printf("方程无解或者解不惟一!\n");
return NULL;
}
}
result = (float*)malloc(sizeof(float)*line);
result[line-1] = 1;
for(i=line-1; i>=0; --i)
{
tmp = 0;
j = line - 1;
while(j > i)
{
tmp += matrix[i][j] * result[j];
--j;
}
result[i] = (matrix[i][line] - tmp) / matrix[i][i];
}
return result;
}

/*
*功能:用列主元消去法将矩阵变为上三角形矩阵
*参数:matrix矩阵, matrixLine矩阵行数
*
*/
void eliminationMain(float **matrix, long matrixLine)
{
long i, j, k, sub, maxSub;
float tmp;
for(i=0; i<matrixLine-1; ++i)//列
{
maxSub = i;