给出几种产品组合,求出产品最大优惠值
protected void Button1_Click(object sender, EventArgs e)
{
string str_input = TextBox1.Text;
List<Product> list_Rule = new List<Product>();
//规则
list_Rule.Add(new Product("A", 1));
list_Rule.Add(new Product("B", 1));
list_Rule.Add(new Product("C", 2));
list_Rule.Add(new Product("E", 1));
list_Rule.Add(new Product("AB", 3));
list_Rule.Add(new Product("BC", 4));
list_Rule.Add(new Product("BDF", 6));
list_Rule.Add(new Product("ABDF", 9));
list_Rule.Add(new Product("ABCD", 10));
var s1 = from v in list_Rule
select v.StrName;
List<string> resultList = GetResult(str_input, s1.ToArray());
string resultString = null;
for (int i = 0; i < resultList.Count; i++)
{
resultString += resultList[i] + ",";
}
if (resultString.Length > 0)
{
var s2 = from v in list_Rule
join o in resultList
on v.StrName equals o.ToString()
select v.Price;
Label1.Text = "优惠"+ s2.Max() +"元";
}
else
Label1.Text = "优惠O元";
}
private List<string> GetResult(string s2, string[] s1)
{
List<string> resultList = new List<string>();
//先初步过滤长度比s2大的字符串
List<string> newS1 = new List<string>();
for (int i = 0; i < s1.Length; i++)
{
if (s1[i].Length <= s2.Length)
{
newS1.Add(s1[i]);
}
}
int num2 = GetNum(s2);
int itemNum = 0;
for (int i = 0; i < newS1.Count; i++)
{
itemNum = GetNum(s1[i]);
if ((itemNum & num2) == itemNum)
{
resultList.Add(s1[i]);
}
}
return resultList;
}
//把字符串成位串一共26位,从低位到高位依次标识字符(a-z)是否在字符串中
private int GetNum(string s)
{
int n = 0;//4个字节=32位
char aChar;
char constChar = 'A';
int position = 0; //字符和'a'的差为k,根据映射规则,说明2进制数的
//从低位算起的第(k+1)位上为1,对应的整数为2的k次方;
//首先把每个字符串映射成26位的二进制数
// zy xwvu tsrq ponm lkji hgfe dcba
//例如 s1[i]="abc"——>00 0000 0000 0000 0000 0000 0111=square(2,a-(a-1))+square(2,b-(a-1))++square(2,b-(a-1));
//s2="cbeh"——> 00 0000 0000 0000 0000 1001 0110
for (int i = 0; i < s.Length; i++)
{
aChar = s[i];
position = (aChar - constChar);
n += (int)Math.Pow(2, position);
}
return n;
}
class Product
{
String strName;
int price;
public Product(string p, int p_2)
{
// TODO: Complete member initialization
this.strName = p;
this.price = p_2;
}
public String StrName
{
get { return strName; }
set { strName = value; }
}
public int Price
{
get { return price; }
set { price = value; }
}
}
虽然表面是解决了问题,但是细想想还是没有完美的解决这题,如果商品名称换成ID【数字】这个方法不行了。
欢迎集思广益寻找出这题最终答案