110,536
社区成员
发帖
与我相关
我的任务
分享
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private const double cSum=266270.83;//目标值
private List<double> dataList;
private List<String> RsList;
private int gRsCount = 0;//答案个数
private int gBegin = 0;//计时开始
private double[] data;
private void dfs(int n, int b, double m)
{
if (gRsCount>=100) return;//100个答案就退出,如果要求所有答案,注释掉此行
if (m<0) return;
if (Math.Round(m * 1000) == 0)//按照3位小数比较,比较2位小数就乘以100,当初直接用m==0来比较,结果错过了答案
{
List<double> aRs = new List<double>();//保存结果
for (int i = 1; i <= b - 1; i++)
{
if (data[i] > 0)
{
aRs.Add(data[i]);
}
}
aRs.Sort();
//同一个结果集里面,数据位置不同,但是数据集相加的结果还是等于目标数值,会出现结果集重复,需要剔除
//例如1+2+3=6,1+3+2=6,两个答案只需保留一个
StringBuilder sRs = new StringBuilder();
StringBuilder sRs2 = new StringBuilder();
for (int i = 0; i < aRs.Count; i++)
{
sRs2.Append("\r\n"+(aRs[i].ToString()));
sRs.Append(" " + aRs[i].ToString());
}
String s = sRs.ToString();
if (RsList.IndexOf(s) > 0) return;//剔除重复结果
RsList.Add(s);
gRsCount++;
textBox1.AppendText("\r\n用时 " + (System.Environment.TickCount - gBegin).ToString() + " 毫秒");
textBox1.AppendText("找到第 " + gRsCount.ToString() + " 个解 : ");
textBox1.AppendText(sRs2.ToString());
textBox1.AppendText("\r\n");
return;
}
for (int i = b; i <= n - 1; i++)
{
double d = dataList[i];
data[b] = d;
dfs(n, i + 1, m - d);
data[b] = 0;
}
}
private void button1_Click(object sender, EventArgs e)
{
dataList = new List<double>();
RsList = new List<string>();
StreamReader sr = new StreamReader("./data.txt", Encoding.Default);
String line;
while ((line = sr.ReadLine()) != null)
{
dataList.Add(double.Parse(line));
}
//升序或者降序需要根据目标值来定,目标值大就按降序,目标值小就按升序
dataList.Sort((x, y) => -x.CompareTo(y));
dataList.Insert(0, 0);//下标从1开始参与计算
gRsCount = 0;
textBox1.Text = "计算中...";
textBox1.AppendText("\r\n");
gBegin = System.Environment.TickCount;
data = new double[dataList.Count];
dfs(dataList.Count, 1, cSum);
textBox1.AppendText("\r\n计算完成...");
}
}