17,741
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
namespace CP190427
{
public partial class Form1 : Form
{
private List<int> PData = new List<int>();//母数组
private List<int> CDataBak = new List<int>();//子数组(备份)
private List<int> CData = new List<int>();//子数组,凑过的数据会设置为0
private List<int> SData = new List<int>();//凑数时的子数组,每次都从CData里面取大于0的数据
private List<int> RSData = new List<int>();//结果数组
private List<int> BData = new List<int>();//回溯时存放数据
private List<int> Visit = new List<int>();//标记数组
private List<int> SData2 = new List<int>();//凑数后需要排列时的数组
private int PValue = 0;//凑数时的目数字
private int gCount = 0;//排列结果计数
private int gOST = 1100;//阙值
private bool gCheckOST;//是否需要检查阙值
public Form1()
{
InitializeComponent();
}
private void init()
{
PData.Clear();
PData.AddRange(new int[] { 0, 6000, 6000 });
//PData.AddRange(new int[] {0,6000,6000,5000});
CDataBak.Clear();
CDataBak.AddRange(new int[] { 0, 3000, 900, 2000, 800 });
//CDataBak.AddRange(new int[]{0,3000,900,2000,800,1200,4000,2500});
}
private void dfs(int step)
{
int i, sum=0, iRet;
for (i = 1; i <= step - 1; i++)
sum += BData[i];
if (sum>=PValue) return;
else if (sum < PValue)
{
iRet = PValue - sum;
if (iRet <= RSData[0])
{
RSData[0] = iRet;
for (i = 1; i <= step - 1; i++)
RSData[i] = BData[i];
}
}
for(i=1;i<SData.Count;i++)
if (Visit[i] == 0)
{
BData[step] = SData[i];
Visit[i] = 1;
dfs(step + 1);
Visit[i] = 0;
}
}
private void dfs2(int step)
{
int i;
if (step > SData2.Count-1)
{
StringBuilder sRs = new StringBuilder("{");
for (i = 1; i < BData.Count; i++)
sRs.Append(" " + BData[i].ToString());
if (gCheckOST)
{
if (BData[BData.Count-1] < gOST) return;
}
textBox1.AppendText(" "+sRs + " }\r\n");
gCount++;
return;
}
for(i=1;i<SData2.Count;i++)
if (Visit[i] == 0)
{
BData[step] = SData2[i];
Visit[i] = 1;
dfs2(step + 1);
Visit[i] = 0;
}
}
private void button1_Click(object sender, EventArgs e)
{
init();
//this.textBox1.Multiline = true;
this.textBox1.Clear();
CData.Clear();
CData.AddRange(CDataBak.ToArray());
int i, j, k, m;
for (i = 1; i < PData.Count; i++)
{
PValue = PData[i];
if (PValue <= 0) continue;
this.textBox1.AppendText(PValue.ToString() + "\r\n");
SData.Clear();
SData = CData.FindAll((v) => { return v > 0; });
if (SData.Count <= 0)
this.textBox1.AppendText("{}\r\n");
else
{
SData.Insert(0,0);
RSData.Clear();
BData.Clear();
Visit.Clear();
for (k = 0; k < SData.Count; k++)
{
RSData.Add(0);
BData.Add(0);
Visit.Add(0);
}
RSData[0] = PValue;
dfs(1);
SData2.Clear();
SData2 = RSData.FindAll((v) => { return v > 0; });
if (SData2.Count <= 0)
this.textBox1.AppendText("{}\r\n");
else
{
BData.Clear();
Visit.Clear();
BData.Add(0);
Visit.Add(0);
for (j = 1; j < SData2.Count; j++)
{
m = SData2[j];
BData.Add(0);
Visit.Add(0);
for(k=1;k<CData.Count;k++)
if (CData[k] == m)
{
CData[k] = 0;
break;
}
}
gCheckOST = RSData[0] < gOST;
gCount = 0;
dfs2(1);
if (gCount <= 0)
this.textBox1.AppendText("{}\r\n");
}
}
}
}
}
}