Algorithm 获得所有组合的最有效方法是什么?
可能重复:Algorithm 获得所有组合的最有效方法是什么?,algorithm,Algorithm,可能重复: 问题 您有一个人员列表作为输入,每个人都有一定数量的学分。您将获得一个总数,该总数必须通过使用一个或多个个人学分来实现。该函数应输出将导致总计的所有现有组合 例如,见下文:- static void Main(string[] args) { int total = Convert.ToInt32(args[0]); var persons = new List<Person>(); persons.Add(new Person { Credit
问题 您有一个人员列表作为输入,每个人都有一定数量的学分。您将获得一个总数,该总数必须通过使用一个或多个个人学分来实现。该函数应输出将导致总计的所有现有组合 例如,见下文:-
static void Main(string[] args)
{
int total = Convert.ToInt32(args[0]);
var persons = new List<Person>();
persons.Add(new Person { Credits = 10, Name="Steve"});
persons.Add(new Person { Credits = 5, Name = "Paul" });
persons.Add(new Person { Credits = 4, Name = "David" });
persons.Add(new Person { Credits = 1, Name = "Kenneth" });
PrintAllCombinations(persons, total); // The function in question
}
public class Person
{
public string Name { get; set; }
public int Credits { get; set; }
}
static void Main(字符串[]args)
{
int total=Convert.ToInt32(args[0]);
var persons=新列表();
添加(新人员{Credits=10,Name=“Steve”});
添加(新的人{Credits=5,Name=“Paul”});
添加(新人员{Credits=4,Name=“David”});
添加(新人员{Credits=1,Name=“Kenneth”});
PrintAllCombinations(persons,total);//所讨论的函数
}
公共阶层人士
{
公共字符串名称{get;set;}
公共整数积分{get;set;}
}
在上面的示例中,如果总共有10个,PrintAllCombinations函数应该输出类似于以下内容的内容:-
- 组合1)史蒂夫:10
- 组合2)保罗:5,大卫4,肯尼思1
- 组合3)史蒂夫:9,保罗1
- 组合4)史蒂夫:5,保罗5
- …等等
最好的解决方案是什么?您可以在中或此处阅读此普遍问题的解决方案
根据您的编辑指定您可以获得部分学分,您还应查看以下帖子:
,用C编写,同样适用于您的情况。由于背包问题是NP完全问题,在一般情况下没有有效的算法。但是,由于学分数量较少,您可以使用动态规划记忆以下功能:
F(N, W) := can we add up to W, using only the first N people?
F(0, 0) = True
F(0, _) = False
F(N, W) = F(N-1, W) || F(N-1, W-w[N])
这个问题是针对c的,我根本看不出这个问题是如何针对c的。您只需要通用数据结构和一些动态编程。