算法问题 任给1<=n<=20个不同等非零正整数,每个正整数最多使用一次,请问这n个正整数能够加和的结果共有多少种?这个是我们学校软件技能大赛的题目,大家讨论下啊用C#写下啊、。。呵呵 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 static void Main(string[] args) { int i = GetCombinationCount(new int[] { 1, 2, 3 }); //i=6 } static int GetCombinationCount(int[] nums) { Dictionary<int, int> sums = new Dictionary<int, int>(); int combinations = 1 << nums.Length; for (int i = 1; i < combinations; i++) { string masks = Convert.ToString(i, 2).PadLeft(nums.Length, '0'); int sum = 0; for (int j = 0; j < masks.Length; j++) { if (masks[j] == '1') sum += nums[j]; } sums[sum] = 1; } return sums.Count; }} 这样写可能更能对一些算法派的胃口:原理简单的说就是n个灯(或n bits),用或者不用,总的组合等于2^nstatic int GetCombinationCount(int[] nums){ Dictionary<int, int> sums = new Dictionary<int, int>(); int combinations = 1 << nums.Length; for (int i = 1; i < combinations; i++) { int sum = 0, mask = i; foreach (int n in nums) { if (mask == 0) break; if (mask % 2 == 1) sum += n; mask >>= 1; } sums[sum] = 1; } return sums.Count;} "任给1 <=n <=20个不同等非零正整数"这句没懂!假如n=4,这四个数是1,2,3,4呢,还是1000,786,33,223? 应该有2的n次方-1种: static void Main(string[] args) { int[] a = { 24, 4, 31, 14, 59 }; GetCombination(a); } static string GetBinaryString(int n, int length) { string result = string.Empty; int mod = 0; while (n != 0) { mod = n % 2; n = n / 2; result = mod.ToString() + result; } if (result.Length < length) result = result.PadLeft(length, '0'); return result; } static void GetCombination(int[] nums) { double count = Math.Pow(2, nums.Length); for (int i = 1; i <= count - 1; i++) { Console.Write("可能的组合有:"); string str = GetBinaryString(i, nums.Length); int sum = 0; for (int j = 0; j < str.Length; j++) { if (str[j] == '1') { Console.Write(nums[j] + " "); sum += nums[j]; } } Console.WriteLine("和为:" + sum); } }输出为:=======================================================可能的组合有:59 和为:59可能的组合有:14 和为:14可能的组合有:14 59 和为:73可能的组合有:31 和为:31可能的组合有:31 59 和为:90可能的组合有:31 14 和为:45可能的组合有:31 14 59 和为:104可能的组合有:4 和为:4可能的组合有:4 59 和为:63可能的组合有:4 14 和为:18可能的组合有:4 14 59 和为:77可能的组合有:4 31 和为:35可能的组合有:4 31 59 和为:94可能的组合有:4 31 14 和为:49可能的组合有:4 31 14 59 和为:108可能的组合有:24 和为:24可能的组合有:24 59 和为:83可能的组合有:24 14 和为:38可能的组合有:24 14 59 和为:97可能的组合有:24 31 和为:55可能的组合有:24 31 59 和为:114可能的组合有:24 31 14 和为:69可能的组合有:24 31 14 59 和为:128可能的组合有:24 4 和为:28可能的组合有:24 4 59 和为:87可能的组合有:24 4 14 和为:42可能的组合有:24 4 14 59 和为:101可能的组合有:24 4 31 和为:59可能的组合有:24 4 31 59 和为:118可能的组合有:24 4 31 14 和为:73可能的组合有:24 4 31 14 59 和为:132请按任意键继续. . . 几个数和值和另外的几个数一样的情况还要减去。gomoku写得很好了用dictionary 其中的sums[sum] = 1 这句话很好很强大 一道面试题,求高人! c#开发串口程序 按下按鈕後刷新gridview 初始化FormStartPosition.CenterScreen无效 c# -Windows Mobile下HttpWebRequest请求几次后死掉,不能再发出请求 求助,急 大家帮帮忙! 3D来啦!!!揭秘3D图像转换啦! xinyaping(眼镜哥)及各位大牛看过来 有关P-invoke 正则取字符串的问题 初级问题,解决马上给分 TREEVIEW节点问题
static void Main(string[] args)
{
int i = GetCombinationCount(new int[] { 1, 2, 3 }); //i=6
} static int GetCombinationCount(int[] nums)
{
Dictionary<int, int> sums = new Dictionary<int, int>();
int combinations = 1 << nums.Length; for (int i = 1; i < combinations; i++)
{
string masks = Convert.ToString(i, 2).PadLeft(nums.Length, '0');
int sum = 0;
for (int j = 0; j < masks.Length; j++)
{
if (masks[j] == '1') sum += nums[j];
}
sums[sum] = 1;
}
return sums.Count;
}
}
原理简单的说就是n个灯(或n bits),用或者不用,总的组合等于2^nstatic int GetCombinationCount(int[] nums)
{
Dictionary<int, int> sums = new Dictionary<int, int>();
int combinations = 1 << nums.Length; for (int i = 1; i < combinations; i++)
{
int sum = 0, mask = i;
foreach (int n in nums)
{
if (mask == 0) break;
if (mask % 2 == 1) sum += n;
mask >>= 1;
}
sums[sum] = 1;
}
return sums.Count;
}
假如n=4,这四个数是1,2,3,4呢,还是1000,786,33,223?
{
int[] a = { 24, 4, 31, 14, 59 };
GetCombination(a);
}
static string GetBinaryString(int n, int length)
{
string result = string.Empty;
int mod = 0;
while (n != 0)
{
mod = n % 2;
n = n / 2;
result = mod.ToString() + result;
}
if (result.Length < length)
result = result.PadLeft(length, '0');
return result;
} static void GetCombination(int[] nums)
{
double count = Math.Pow(2, nums.Length);
for (int i = 1; i <= count - 1; i++)
{
Console.Write("可能的组合有:");
string str = GetBinaryString(i, nums.Length);
int sum = 0;
for (int j = 0; j < str.Length; j++)
{
if (str[j] == '1')
{
Console.Write(nums[j] + " ");
sum += nums[j];
}
}
Console.WriteLine("和为:" + sum);
}
}输出为:
=======================================================
可能的组合有:59 和为:59
可能的组合有:14 和为:14
可能的组合有:14 59 和为:73
可能的组合有:31 和为:31
可能的组合有:31 59 和为:90
可能的组合有:31 14 和为:45
可能的组合有:31 14 59 和为:104
可能的组合有:4 和为:4
可能的组合有:4 59 和为:63
可能的组合有:4 14 和为:18
可能的组合有:4 14 59 和为:77
可能的组合有:4 31 和为:35
可能的组合有:4 31 59 和为:94
可能的组合有:4 31 14 和为:49
可能的组合有:4 31 14 59 和为:108
可能的组合有:24 和为:24
可能的组合有:24 59 和为:83
可能的组合有:24 14 和为:38
可能的组合有:24 14 59 和为:97
可能的组合有:24 31 和为:55
可能的组合有:24 31 59 和为:114
可能的组合有:24 31 14 和为:69
可能的组合有:24 31 14 59 和为:128
可能的组合有:24 4 和为:28
可能的组合有:24 4 59 和为:87
可能的组合有:24 4 14 和为:42
可能的组合有:24 4 14 59 和为:101
可能的组合有:24 4 31 和为:59
可能的组合有:24 4 31 59 和为:118
可能的组合有:24 4 31 14 和为:73
可能的组合有:24 4 31 14 59 和为:132
请按任意键继续. . .
gomoku写得很好了
用dictionary
其中的sums[sum] = 1 这句话很好很强大