假设有一个DataTable,如下所示:
每一行都是(N1,N2,N3,N4)的组合,具有这种约束:
我正在寻找一套解决方案,对于整套来说,"没有任何组合必须有一个值,其数量列小于其子组合的总和&#34 ;;。
例如,行的数量:1必须大于行的总和:2,10,11,因此行的数量:2必须大于行的总和:3,4,5,6,7,8, 9(在特定情况下哪一个当然无效)。
我的开发环境是C#.net,首选使用Linq。
提前致谢
答案 0 :(得分:0)
您可以将一个方法放在一起,该方法决定两个Tuple<N1,N2,N3,N4>
类似对象的父子关系。想法:位数组表示和移位。有了这个天真的模型:
public class Budget
{
public int Id { get; set; }
//
public int N1 { get; set; }
public Nullable<int> N2 { get; set; }
public Nullable<int> N3 { get; set; }
public Nullable<int> N4 { get; set; }
//
public float Amount { get; set; }
/// <summary>
/// Method analyzes if current object is a parent of <paramref name="other"/>
/// if you override GetHashCode or provide a nifty bit array representation
/// you can infer parent-child relationships with really fast bit shifting
/// </summary>
/// <param name="other">budget to compare with</param>
public bool IsParentOf (Budget other)
{
// ommitted for too-time-consuming and 'your work obviously'
// or 'not-the-purpose-of-this-site'reasons
return true;
}
}
您可以尝试为每个预算条目获取子组合(此处为您的分类):
Budget b1 = new Budget() { N1 = 1, N2 = null, N3 = null, N4 = null, Amount = 1200f };
Budget b11 = new Budget() { N1 = 1, N2 = 1, N3 = null, N4 = null, Amount = 800f };
Budget b111 = new Budget() { N1 = 1, N2 = 1, N3 = 1, N4 = null, Amount = 800f };
Debug.Assert (b1.IsParentOf(b11));
Debug.Assert(b1.IsParentOf(b111));
Debug.Assert(b11.IsParentOf(b111));
var budgetEntries = new List<Budget>() { b11, b111 };
var subCombinations = budgetEntries.Where(be => b1.IsParentOf(be));
Debug.Assert(b1.Amount > subCombinations.Sum(sc => sc.Amount));
当然,对于整个预算条目数据集,您必须将每个条目与所有其他条目(如笛卡尔积)匹配。我并不认为这很快,但绝对应该做到这一点。