. , . : (, 100+) .
, () , - .
, K, 2 K + 1 . null, 0, .
, :
7 -> _
6 -> _
5 -> _
4 -> _
3 -> _
2 -> _
1 -> _
0 -> []
if b=8 ( b=8 , , , ).
_ ( null) [] ( , ).
. ( null) . "" : , . , . :
for(int s = b-xi-1; s >= 0; s--) {
if(cols[s+xi] == null && cols[s] != null) {
List<int> cln = new List<int>(cols[s]);
cln.Add(xi);
cols[s+xi] = cln;
}
}
xi , . , if , s ( null), : . for : : s+xi s . , s 0 () b-xi-1 ( ). , xi .
, , 2, () 0 8-2-1=5. , s=0, "" , :
7 -> _
6 -> _
5 -> _
4 -> _
3 -> _
2 -> [2]
1 -> _
0 -> []
([2] 2), for, s=1 , , , s=2 . , , 2 , :
7 -> _
6 -> _
5 -> _
4 -> [2,2]
3 -> _
2 -> [2]
1 -> _
0 -> []
: , , , , . xi , , "" . , :
7 -> _
6 -> _
5 -> _
4 -> _
3 -> _
2 -> [2]
1 -> _
0 -> []
1, :
7 -> _
6 -> _
5 -> _
4 -> _
3 -> [2,1]
2 -> [2]
1 -> [1]
0 -> []
, 3, :
7 -> _
6 -> [2,1,3]
5 -> [2,3]
4 -> [1,3]
3 -> [2,1]
2 -> [2]
1 -> [1]
0 -> []
, 3 [3], . . , [2,1], [3], , .
, , null, . . , , , , K.
:
static List<int> GetSubset(int value, IEnumerable<int> xs) {
int b = 2*value;
List<int>[] cols = new List<int>[b];
cols[0] = new List<int>();
foreach(int xi in xs) {
for(int s = b-xi-1; s >= 0; s--) {
if(cols[s+xi] == null && cols[s] != null) {
List<int> cln = new List<int>(cols[s]);
cln.Add(xi);
cols[s+xi] = cln;
}
}
}
for(int d = 0; d < value; d++) {
if(cols[value-d] != null) {
return cols[value-d];
} else if(cols[value+d] != null) {
return cols[value+d];
}
}
return cols[0];
}
List<T> : (, , .NET, , ).
( csharp):
$ csharp
Mono C# Shell, type "help;" for help
Enter statements below.
csharp> public class Foo {
>
> public static List<int> GetSubset(int value, IEnumerable<int> xs) {
> int b = 2*value;
> List<int>[] cols = new List<int>[b];
> cols[0] = new List<int>();
> foreach(int xi in xs) {
> for(int s = b-xi-1; s >= 0; s--) {
> if(cols[s+xi] == null && cols[s] != null) {
> List<int> cln = new List<int>(cols[s]);
> cln.Add(xi);
> cols[s+xi] = cln;
> }
> }
> }
> for(int d = 0; d < value; d++) {
> if(cols[value-d] != null) {
> return cols[value-d];
> } else if(cols[value+d] != null) {
> return cols[value+d];
> }
> }
> return cols[0];
> }
> }
csharp>
csharp> int[] items = new int[] {2,3,5,7};
csharp> Foo.GetSubset(8,items);
{ 3, 5 }
csharp> Foo.GetSubset(7,items);
{ 2, 5 }
csharp> Foo.GetSubset(9,items);
{ 2, 7 }
csharp> Foo.GetSubset(6,items);
{ 2, 3 }
csharp> Foo.GetSubset(10,items);
{ 2, 3, 5 }
csharp> Foo.GetSubset(11,items);
{ 2, 3, 5 }
, 6 , , 5.
, : , , K, K + 1, K-1 .. , .