Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 获得所有组合的最有效方法是什么?_Algorithm - Fatal编程技术网

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
  • …等等
更新:我忘了提到,您可以使用个人信用卡的任何部分

我使用的示例是简化的,但实际场景将限制为不超过100人,总人数将始终少于90人


最好的解决方案是什么?

您可以在中或此处阅读此普遍问题的解决方案


根据您的编辑指定您可以获得部分学分,您还应查看以下帖子:


,用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的。您只需要通用数据结构和一些动态编程。