Aklımda bir yöntem var ama yazarak anlatması uzun sürer sanırım. Zor geliyo anlatması şu an :D
Algoritma sorunu
Cevaplar
ben çözerim bu işi, ama önce gidip klavye almam gerek, harbi benimle yaşıt bu, yazmıyorrrrr... :(cgrszone dedi: ↑Aklımda bir yöntem var ama yazarak anlatması uzun sürer sanırım. Zor geliyo anlatması şu an :D
Bu arada aklınızda bulunsun da 10 sayı olunca iyi güzel de 100 sayı olsa gümler bu yöntem.bt38 dedi: ↑Bütün sayıları toplayıp 2'ye böl.
Daha sonra bulduğun sonuca en yakın toplamı bul.
O toplamı veren 1.grup olur, kalanları 2.grup olarak ata.
Yok mu daha akılcı bi yöntem. Merak ettim şimdi.
Steplere ayır? Şekil, şema kullan? Adam yol bulmuş paylaşmıyor arkadaş, bu ne biçim bir forum anlayışıdır!! :) O yol anlatılacak!! :Dcgrszone dedi: ↑Aklımda bir yöntem var ama yazarak anlatması uzun sürer sanırım. Zor geliyo anlatması şu an :D
10 sayının 5'li bütün alt kümelerini bulursun.killbillgates dedi: ↑İyi günler hayırlı ramazanlar.
Şu problemi çözmemde yardımcı olursanız sevinirim.
Elimizde 10 adet sayı olsun. Bu sayıları 5'erlik iki gruba,grupların toplam değerleri birbirine mümkün olduğunca yakın olacak şekilde nasıl ayırabiliriz?
Bu 5'li alt kümeleri en baştakınden başlayarak yanındaki ile karşılaştırarak gidersin. Elinde
10'un 5'li kombinasyonları kadar 5 elemanlı alt küme olacak.
bu da 10!/(10-5)!*5 o da (10*9*8*7*6 ) / (1*2*3*4*5) = 252 olur. Elimizde 252 tane 5'erlik alt kümeler var.
252 elemanlı kümenin 2'şerli alt kümelerini bulup. Bu 2'li kümelerden ortak elemanları olanları eleyeceksin. ( 10 elemanlı küme iki parçaya bölününce bir sayı aynı anda tek tarafta olabilir eğer sayı birden fazla kere yazılmadı ise. Sayının birden fazla yazılabilmesi kuralı var ise. Mesela sayı "k" kere kullanışmış ise ikili kümelerde k'dan fazla sayıda aynı sayı olmamalı)
Bu eleme işleminden sonra ikişerli kümenin her elemanının ( 5 sayı içeren kümelerdir ) toplamlarını bulursun. Toplamlar arasındaki en az fark olanlar senin aradığın bölüm kuralıdır.
onu 100 sayı olunca düşünürüz biz gene... ;)bt38 dedi: ↑Bu arada aklınızda bulunsun da 10 sayı olunca iyi güzel de 100 sayı olsa gümler bu yöntem.
Yok mu daha akılcı bi yöntem. Merak ettim şimdi.
şimdi on sayıyla neler yapcaz ona bakalım...
Şu an öğle arası evdeyim. işyerine gidince ufak bir programcık yazayım bakalım nasıl olacak. dizilerle kolayca çözülür gibime geliyor.
bir diğer yöntem de tam emin olmamakla birlikte.
Sayıları büyükten küçüğe sıralarsın. Arkasından iki kümeye şu mantıkla dağıtırsın.
1 - Birinci küme
2 - İkinci küme
1 2 - 2 1 - 1 2 - 2 1 - 1 2
Bu sıralamanın mantığı; her ikili çiftin büyüğünü bir öncekinin tersine vermektir.
Yani ilk iki sayının büyüğünü birinci kümeye verdinse, ikinci iki sayının büyüğünü ikinci kümeye vermelisin ki ara açılmasın.
Sayıları büyükten küçüğe sıralarsın. Arkasından iki kümeye şu mantıkla dağıtırsın.
1 - Birinci küme
2 - İkinci küme
1 2 - 2 1 - 1 2 - 2 1 - 1 2
Bu sıralamanın mantığı; her ikili çiftin büyüğünü bir öncekinin tersine vermektir.
Yani ilk iki sayının büyüğünü birinci kümeye verdinse, ikinci iki sayının büyüğünü ikinci kümeye vermelisin ki ara açılmasın.
Aklıma daha farklı bir mantık geldi ama emin değilim denemek lazım. Şimdi 10 sayımız var ve bunları 5'erli 2 gruba ayıracak ve aradaki en küçük farkı bulacaksak sanki şöyle yapmak olur gibi (hala emin değilim denemek lazım):
Sayılar büyükten küçüğe sıralanır
En büyük sayı bir gruba ondan bir küçük olanı diğer gruba verilir.
Ardından sayılar dağıtıma şu şekilde başlanır. İki gruba verilen sayıların toplamlarına bakılır, toplamı büyük olan gruba kalanlardan en küçük olanı, toplamı küçük olana da en kalanlardan büyük sayı verilir.
Kalan sayılar bitince en yakın fark oluşmuş olur. (diye tahmin ediyorum :D)
Edit : Bir üstteki yorumu okumamıştım sanırım 3 aşağı 5 yukarı aynı olay :)
Sayılar büyükten küçüğe sıralanır
En büyük sayı bir gruba ondan bir küçük olanı diğer gruba verilir.
Ardından sayılar dağıtıma şu şekilde başlanır. İki gruba verilen sayıların toplamlarına bakılır, toplamı büyük olan gruba kalanlardan en küçük olanı, toplamı küçük olana da en kalanlardan büyük sayı verilir.
Kalan sayılar bitince en yakın fark oluşmuş olur. (diye tahmin ediyorum :D)
Edit : Bir üstteki yorumu okumamıştım sanırım 3 aşağı 5 yukarı aynı olay :)
benim son algoritmanın upgraded versiyonu gibi :) hatta oldukça da başarılı. her seferinde toplamı alıp bir sonraki dağıtıma karar verilir. bitti gitti :)cgrszone dedi: ↑Aklıma daha farklı bir mantık geldi ama emin değilim denemek lazım. Şimdi 10 sayımız var ve bunları 5'erli 2 gruba ayıracak ve aradaki en küçük farkı bulacaksak sanki şöyle yapmak olur gibi (hala emin değilim denemek lazım):
Sayılar büyükten küçüğe sıralanır
En büyük sayı bir gruba ondan bir küçük olanı diğer gruba verilir.
Ardından sayılar dağıtıma şu şekilde başlanır. İki gruba verilen sayıların toplamlarına bakılır, toplamı büyük olan gruba kalanlardan en küçük olanı, toplamı küçük olana da en kalanlardan büyük sayı verilir.
Kalan sayılar bitince en yakın fark oluşmuş olur. (diye tahmin ediyorum :D)
Elde 1-2 test yaptım sanırım doğru bir algoritma. Yine de farklı bir çok sayı ile test etmek lazım tabi :)annttiigs dedi: ↑benim son algoritmanın upgraded versiyonu gibi :) hatta oldukça da başarılı. her seferinde toplamı alıp bir sonraki dağıtıma karar verilir. bitti gitti :)
Program şu şekilde oluyor ...__kadıköyRAP__ dedi: ↑Böyle yılan şeklinde gitmeyi dene emin edeğilim belki tutar.
public void Hesapla()
{List<int> Sayilar = new List<int>() { 3,6,95,41,25,36,52,14,52,36 };
List<int> aGrup = new List<int>();
List<int> bGrup = new List<int>();
Sayilar.Sort();
int kontrol = 1;
for (int i = 0; i < Sayilar.Count; i++)
{
if (kontrol / 2 >= 1)
{
bGrup.Add(Sayilar);
if ((kontrol + 1) % 2 == 0) kontrol = -1;
}
else
{
aGrup.Add(Sayilar);
}
kontrol++;
}
int fark = Math.Abs(GrupToplam(aGrup) - GrupToplam(bGrup)); // Bu değişken ile aradaki farkı görebilirsin...
}
int GrupToplam(List<int> grup)
{int toplam = 0;
foreach (int sayi in grup)
{
toplam += sayi;
}
return toplam;
}
Çalışıyor gibi , birkaç test yaptımda :)
Algoritmasını oluşturmak biraz kasar ama kesin çözüm yanılmıyorsam aşağıdaki gibi;
-Dizideki 10 sayının toplamının yarısı alınır ve tam sayıya yuvarlanır.
-Dizideki 10 sayının 5 li kombinasyonları alınır ve toplanır. Her bir kombinasyon için hangi sayılardan oluştuğu ve toplamı ayrı bir dizide yedeklenir.
-Tüm 5'li kombinasyon toplamları içerisinden ilk adımda hesapladığımız toplamlarının yarısına en yakın olam kombinasyon seçilir ve sonuç bulunur.
Yukarıdaki çözümlerin birçoğuna kafa patlattım ama hepsinde sanki bir açık var gibi. Dizideki sayılar çok alakasız gelirse yanlış hesaplama ihtimali yüksek.
-Dizideki 10 sayının toplamının yarısı alınır ve tam sayıya yuvarlanır.
-Dizideki 10 sayının 5 li kombinasyonları alınır ve toplanır. Her bir kombinasyon için hangi sayılardan oluştuğu ve toplamı ayrı bir dizide yedeklenir.
-Tüm 5'li kombinasyon toplamları içerisinden ilk adımda hesapladığımız toplamlarının yarısına en yakın olam kombinasyon seçilir ve sonuç bulunur.
Yukarıdaki çözümlerin birçoğuna kafa patlattım ama hepsinde sanki bir açık var gibi. Dizideki sayılar çok alakasız gelirse yanlış hesaplama ihtimali yüksek.
Benim önerdiğimi kağıt kalem ile alakasız sayılarla dene istersen. Olabilecek en yakın sonuç alınıyor :)tambjk dedi: ↑Algoritmasını oluşturmak biraz kasar ama kesin çözüm yanılmıyorsam aşağıdaki gibi;
-Dizideki 10 sayının toplamının yarısı alınır ve tam sayıya yuvarlanır.
-Dizideki 10 sayının 5 li kombinasyonları alınır ve toplanır. Her bir kombinasyon için hangi sayılardan oluştuğu ve toplamı ayrı bir dizide yedeklenir.
-Tüm 5'li kombinasyon toplamları içerisinden ilk adımda hesapladığımız toplamlarının yarısına en yakın olam kombinasyon seçilir ve sonuç bulunur.
Yukarıdaki çözümlerin birçoğuna kafa patlattım ama hepsinde sanki bir açık var gibi. Dizideki sayılar çok alakasız gelirse yanlış hesaplama ihtimali yüksek.
Aşağıdaki yaptığım örnek 1 den 100 e kadar rasgele sayılar arasındadır.

Random r = new Random();
int[] grup1 = new int[5];
int[] grup2 = new int[5];
for (int i = 0; i < grup1.Length; i++)
{
int randomSayi = r.Next(1, 50);
int sorgu1 = Array.IndexOf(grup1, randomSayi);
int sorgu2 = Array.IndexOf(grup2, randomSayi);
if (sorgu1 != -1 && sorgu2 != -1)
{
i--;
continue;
}
grup1[i] = randomSayi;
grup2[i] = randomSayi + 1;
}
int farkSayisi = Array.IndexOf(grup1, grup1[4] - 1);
do
{
grup2[4] = grup1[4] - 5;
} while (farkSayisi != -1 && grup2[4] > 0 && grup2[4]<101);
int dizi1Top = 0;
int dizi2Top = 0;
for (int i = 0; i < grup1.Length; i++)
{
dizi1Top += grup1[i];
Console.Write(grup1[i] + " ");
}
Console.Write(" Dizi1 Toplamı: {0}",dizi1Top);
Console.WriteLine();
for (int i = 0; i < grup2.Length; i++)
{
dizi2Top += grup2[i];
Console.Write(grup2[i] + " ");
}
Console.Write(" Dizi2 Toplamı: {0}", dizi2Top);
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("İki dizi arasındaki fark: {0}",(dizi1Top-dizi2Top));
Console.ReadLine();
Çözümü;tambjk dedi: ↑Algoritmasını oluşturmak biraz kasar ama kesin çözüm yanılmıyorsam aşağıdaki gibi;
-Dizideki 10 sayının toplamının yarısı alınır ve tam sayıya yuvarlanır.
-Dizideki 10 sayının 5 li kombinasyonları alınır ve toplanır. Her bir kombinasyon için hangi sayılardan oluştuğu ve toplamı ayrı bir dizide yedeklenir.
-Tüm 5'li kombinasyon toplamları içerisinden ilk adımda hesapladığımız toplamlarının yarısına en yakın olam kombinasyon seçilir ve sonuç bulunur.
Yukarıdaki çözümlerin birçoğuna kafa patlattım ama hepsinde sanki bir açık var gibi. Dizideki sayılar çok alakasız gelirse yanlış hesaplama ihtimali yüksek.
import java.math.BigInteger;
public class kombinasyon {
private int[] a;
private int n;
private int r;
private BigInteger numLeft;
private BigInteger total;
public kombinasyon (int n, int r) {
if (r > n) {
throw new IllegalArgumentException ();
}
if (n < 1) {
throw new IllegalArgumentException ();
}
this.n = n;
this.r = r;
a = new int[r];
BigInteger nFact = getFactorial (n);
BigInteger rFact = getFactorial (r);
BigInteger nminusrFact = getFactorial (n - r);
total = nFact.divide (rFact.multiply (nminusrFact));
reset ();
}
public void reset () {
for (int i = 0; i < a.length; i++) {
a = i;
}
numLeft = new BigInteger (total.toString ());
}
//------------------------------------------------
//Return number of combinations not yet generated
//------------------------------------------------
public BigInteger getNumLeft () {
return numLeft;
}
//-----------------------------
//Are there more combinations?
//-----------------------------
public boolean hasMore () {
return numLeft.compareTo (BigInteger.ZERO) == 1;
}
//------------------------------------
//Return total number of combinations
//------------------------------------
public BigInteger getTotal () {
return total;
}
//------------------
//Compute factorial
//------------------
private static BigInteger getFactorial (int n) {
BigInteger fact = BigInteger.ONE;
for (int i = n; i > 1; i--) {
fact = fact.multiply (new BigInteger (Integer.toString (i)));
}
return fact;
}
//--------------------------------------------------------
//Generate next combination (algorithm from Rosen p. 286)
//--------------------------------------------------------
public int[] getNext () {
if (numLeft.equals (total)) {
numLeft = numLeft.subtract (BigInteger.ONE);
return a;
}
int i = r - 1;
while (a == n - r + i) {
i--;
}
a = a + 1;
for (int j = i + 1; j < r; j++) {
a[j] = a + j - i;
}
numLeft = numLeft.subtract (BigInteger.ONE);
return a;
}
}
------------------------------------
import java.util.ArrayList;
import java.util.List;
public class test {
public test() {
}
public static void main(String[] args) {
String[] elements = {"1", "3","9","10","20","21","22","35","79","101"};
int[] index;
kombinasyon x = new kombinasyon (elements.length, 5);
StringBuffer combination;
List list = new ArrayList();// kombinasyonu oluşturan sayıları ve bu sayıların toplamları tutulur.
List toplamList = new ArrayList(); //kombinasyon toplamları tutulur.
System.out.println("KOMBİNASYONLAR");
while (x.hasMore ()) {
String[] temp = new String[2];
combination = new StringBuffer ();
index = x.getNext ();
int toplam = 0;
for (int i = 0; i < index.length; i++) {
combination.append (elements[index]+"+");
toplam += Integer.parseInt(elements[index]);
}
System.out.println (combination.toString ()+" kombinasyon toplam="+toplam);
temp[0] = combination.toString ();
temp[1] = toplam+"";
list.add(temp);
toplamList.add(toplam);
}
int elementsSum = 0;
int hedef = 0;
for(int i = 0 ; i< elements.length ; i++){
elementsSum += Integer.parseInt(elements);
}
hedef = Math.round(elementsSum/2);
System.out.println ("Dizideki rakamların toplamının yarısının tam sayıya yuvarlanmış degeri(hedef) : "+hedef);
System.out.println ("Dizi'deki rakamların toplamı : "+elementsSum);
int enyakin = 0;
int fark = Math.abs(Integer.parseInt(toplamList.get(0).toString())-hedef);
for (int i = 1 ; i< toplamList.size() ; i++){
int temp = Math.abs(Integer.parseInt(toplamList.get(i).toString())-hedef);
if(temp<fark) {
enyakin = Integer.parseInt(toplamList.get(i).toString());
fark = temp;
}
}
System.out.println ("Hedef'e en yakın 5'li kombinasyon toplamı : "+enyakin);
for(int i = 0 ; i<list.size() ; i++){
String temp[] = (String[]) list.get(i);
if(temp[1].equals(enyakin+"")){
System.out.println("İlk gruptaki sayılar : "+temp[0]);
}
}
}
}
SONUÇ
KOMBİNASYONLAR
1+3+9+10+20+ kombinasyon toplam=43
1+3+9+10+21+ kombinasyon toplam=44
1+3+9+10+22+ kombinasyon toplam=45
1+3+9+10+35+ kombinasyon toplam=58
1+3+9+10+79+ kombinasyon toplam=102
1+3+9+10+101+ kombinasyon toplam=124
1+3+9+20+21+ kombinasyon toplam=54
1+3+9+20+22+ kombinasyon toplam=55
1+3+9+20+35+ kombinasyon toplam=68
1+3+9+20+79+ kombinasyon toplam=112
1+3+9+20+101+ kombinasyon toplam=134
1+3+9+21+22+ kombinasyon toplam=56
1+3+9+21+35+ kombinasyon toplam=69
1+3+9+21+79+ kombinasyon toplam=113
1+3+9+21+101+ kombinasyon toplam=135
1+3+9+22+35+ kombinasyon toplam=70
1+3+9+22+79+ kombinasyon toplam=114
1+3+9+22+101+ kombinasyon toplam=136
1+3+9+35+79+ kombinasyon toplam=127
1+3+9+35+101+ kombinasyon toplam=149
1+3+9+79+101+ kombinasyon toplam=193
1+3+10+20+21+ kombinasyon toplam=55
1+3+10+20+22+ kombinasyon toplam=56
1+3+10+20+35+ kombinasyon toplam=69
1+3+10+20+79+ kombinasyon toplam=113
1+3+10+20+101+ kombinasyon toplam=135
1+3+10+21+22+ kombinasyon toplam=57
1+3+10+21+35+ kombinasyon toplam=70
1+3+10+21+79+ kombinasyon toplam=114
1+3+10+21+101+ kombinasyon toplam=136
1+3+10+22+35+ kombinasyon toplam=71
1+3+10+22+79+ kombinasyon toplam=115
1+3+10+22+101+ kombinasyon toplam=137
1+3+10+35+79+ kombinasyon toplam=128
1+3+10+35+101+ kombinasyon toplam=150
1+3+10+79+101+ kombinasyon toplam=194
1+3+20+21+22+ kombinasyon toplam=67
1+3+20+21+35+ kombinasyon toplam=80
1+3+20+21+79+ kombinasyon toplam=124
1+3+20+21+101+ kombinasyon toplam=146
1+3+20+22+35+ kombinasyon toplam=81
1+3+20+22+79+ kombinasyon toplam=125
1+3+20+22+101+ kombinasyon toplam=147
1+3+20+35+79+ kombinasyon toplam=138
1+3+20+35+101+ kombinasyon toplam=160
1+3+20+79+101+ kombinasyon toplam=204
1+3+21+22+35+ kombinasyon toplam=82
1+3+21+22+79+ kombinasyon toplam=126
1+3+21+22+101+ kombinasyon toplam=148
1+3+21+35+79+ kombinasyon toplam=139
1+3+21+35+101+ kombinasyon toplam=161
1+3+21+79+101+ kombinasyon toplam=205
1+3+22+35+79+ kombinasyon toplam=140
1+3+22+35+101+ kombinasyon toplam=162
1+3+22+79+101+ kombinasyon toplam=206
1+3+35+79+101+ kombinasyon toplam=219
1+9+10+20+21+ kombinasyon toplam=61
1+9+10+20+22+ kombinasyon toplam=62
1+9+10+20+35+ kombinasyon toplam=75
1+9+10+20+79+ kombinasyon toplam=119
1+9+10+20+101+ kombinasyon toplam=141
1+9+10+21+22+ kombinasyon toplam=63
1+9+10+21+35+ kombinasyon toplam=76
1+9+10+21+79+ kombinasyon toplam=120
1+9+10+21+101+ kombinasyon toplam=142
1+9+10+22+35+ kombinasyon toplam=77
1+9+10+22+79+ kombinasyon toplam=121
1+9+10+22+101+ kombinasyon toplam=143
1+9+10+35+79+ kombinasyon toplam=134
1+9+10+35+101+ kombinasyon toplam=156
1+9+10+79+101+ kombinasyon toplam=200
1+9+20+21+22+ kombinasyon toplam=73
1+9+20+21+35+ kombinasyon toplam=86
1+9+20+21+79+ kombinasyon toplam=130
1+9+20+21+101+ kombinasyon toplam=152
1+9+20+22+35+ kombinasyon toplam=87
1+9+20+22+79+ kombinasyon toplam=131
1+9+20+22+101+ kombinasyon toplam=153
1+9+20+35+79+ kombinasyon toplam=144
1+9+20+35+101+ kombinasyon toplam=166
1+9+20+79+101+ kombinasyon toplam=210
1+9+21+22+35+ kombinasyon toplam=88
1+9+21+22+79+ kombinasyon toplam=132
1+9+21+22+101+ kombinasyon toplam=154
1+9+21+35+79+ kombinasyon toplam=145
1+9+21+35+101+ kombinasyon toplam=167
1+9+21+79+101+ kombinasyon toplam=211
1+9+22+35+79+ kombinasyon toplam=146
1+9+22+35+101+ kombinasyon toplam=168
1+9+22+79+101+ kombinasyon toplam=212
1+9+35+79+101+ kombinasyon toplam=225
1+10+20+21+22+ kombinasyon toplam=74
1+10+20+21+35+ kombinasyon toplam=87
1+10+20+21+79+ kombinasyon toplam=131
1+10+20+21+101+ kombinasyon toplam=153
1+10+20+22+35+ kombinasyon toplam=88
1+10+20+22+79+ kombinasyon toplam=132
1+10+20+22+101+ kombinasyon toplam=154
1+10+20+35+79+ kombinasyon toplam=145
1+10+20+35+101+ kombinasyon toplam=167
1+10+20+79+101+ kombinasyon toplam=211
1+10+21+22+35+ kombinasyon toplam=89
1+10+21+22+79+ kombinasyon toplam=133
1+10+21+22+101+ kombinasyon toplam=155
1+10+21+35+79+ kombinasyon toplam=146
1+10+21+35+101+ kombinasyon toplam=168
1+10+21+79+101+ kombinasyon toplam=212
1+10+22+35+79+ kombinasyon toplam=147
1+10+22+35+101+ kombinasyon toplam=169
1+10+22+79+101+ kombinasyon toplam=213
1+10+35+79+101+ kombinasyon toplam=226
1+20+21+22+35+ kombinasyon toplam=99
1+20+21+22+79+ kombinasyon toplam=143
1+20+21+22+101+ kombinasyon toplam=165
1+20+21+35+79+ kombinasyon toplam=156
1+20+21+35+101+ kombinasyon toplam=178
1+20+21+79+101+ kombinasyon toplam=222
1+20+22+35+79+ kombinasyon toplam=157
1+20+22+35+101+ kombinasyon toplam=179
1+20+22+79+101+ kombinasyon toplam=223
1+20+35+79+101+ kombinasyon toplam=236
1+21+22+35+79+ kombinasyon toplam=158
1+21+22+35+101+ kombinasyon toplam=180
1+21+22+79+101+ kombinasyon toplam=224
1+21+35+79+101+ kombinasyon toplam=237
1+22+35+79+101+ kombinasyon toplam=238
3+9+10+20+21+ kombinasyon toplam=63
3+9+10+20+22+ kombinasyon toplam=64
3+9+10+20+35+ kombinasyon toplam=77
3+9+10+20+79+ kombinasyon toplam=121
3+9+10+20+101+ kombinasyon toplam=143
3+9+10+21+22+ kombinasyon toplam=65
3+9+10+21+35+ kombinasyon toplam=78
3+9+10+21+79+ kombinasyon toplam=122
3+9+10+21+101+ kombinasyon toplam=144
3+9+10+22+35+ kombinasyon toplam=79
3+9+10+22+79+ kombinasyon toplam=123
3+9+10+22+101+ kombinasyon toplam=145
3+9+10+35+79+ kombinasyon toplam=136
3+9+10+35+101+ kombinasyon toplam=158
3+9+10+79+101+ kombinasyon toplam=202
3+9+20+21+22+ kombinasyon toplam=75
3+9+20+21+35+ kombinasyon toplam=88
3+9+20+21+79+ kombinasyon toplam=132
3+9+20+21+101+ kombinasyon toplam=154
3+9+20+22+35+ kombinasyon toplam=89
3+9+20+22+79+ kombinasyon toplam=133
3+9+20+22+101+ kombinasyon toplam=155
3+9+20+35+79+ kombinasyon toplam=146
3+9+20+35+101+ kombinasyon toplam=168
3+9+20+79+101+ kombinasyon toplam=212
3+9+21+22+35+ kombinasyon toplam=90
3+9+21+22+79+ kombinasyon toplam=134
3+9+21+22+101+ kombinasyon toplam=156
3+9+21+35+79+ kombinasyon toplam=147
3+9+21+35+101+ kombinasyon toplam=169
3+9+21+79+101+ kombinasyon toplam=213
3+9+22+35+79+ kombinasyon toplam=148
3+9+22+35+101+ kombinasyon toplam=170
3+9+22+79+101+ kombinasyon toplam=214
3+9+35+79+101+ kombinasyon toplam=227
3+10+20+21+22+ kombinasyon toplam=76
3+10+20+21+35+ kombinasyon toplam=89
3+10+20+21+79+ kombinasyon toplam=133
3+10+20+21+101+ kombinasyon toplam=155
3+10+20+22+35+ kombinasyon toplam=90
3+10+20+22+79+ kombinasyon toplam=134
3+10+20+22+101+ kombinasyon toplam=156
3+10+20+35+79+ kombinasyon toplam=147
3+10+20+35+101+ kombinasyon toplam=169
3+10+20+79+101+ kombinasyon toplam=213
3+10+21+22+35+ kombinasyon toplam=91
3+10+21+22+79+ kombinasyon toplam=135
3+10+21+22+101+ kombinasyon toplam=157
3+10+21+35+79+ kombinasyon toplam=148
3+10+21+35+101+ kombinasyon toplam=170
3+10+21+79+101+ kombinasyon toplam=214
3+10+22+35+79+ kombinasyon toplam=149
3+10+22+35+101+ kombinasyon toplam=171
3+10+22+79+101+ kombinasyon toplam=215
3+10+35+79+101+ kombinasyon toplam=228
3+20+21+22+35+ kombinasyon toplam=101
3+20+21+22+79+ kombinasyon toplam=145
3+20+21+22+101+ kombinasyon toplam=167
3+20+21+35+79+ kombinasyon toplam=158
3+20+21+35+101+ kombinasyon toplam=180
3+20+21+79+101+ kombinasyon toplam=224
3+20+22+35+79+ kombinasyon toplam=159
3+20+22+35+101+ kombinasyon toplam=181
3+20+22+79+101+ kombinasyon toplam=225
3+20+35+79+101+ kombinasyon toplam=238
3+21+22+35+79+ kombinasyon toplam=160
3+21+22+35+101+ kombinasyon toplam=182
3+21+22+79+101+ kombinasyon toplam=226
3+21+35+79+101+ kombinasyon toplam=239
3+22+35+79+101+ kombinasyon toplam=240
9+10+20+21+22+ kombinasyon toplam=82
9+10+20+21+35+ kombinasyon toplam=95
9+10+20+21+79+ kombinasyon toplam=139
9+10+20+21+101+ kombinasyon toplam=161
9+10+20+22+35+ kombinasyon toplam=96
9+10+20+22+79+ kombinasyon toplam=140
9+10+20+22+101+ kombinasyon toplam=162
9+10+20+35+79+ kombinasyon toplam=153
9+10+20+35+101+ kombinasyon toplam=175
9+10+20+79+101+ kombinasyon toplam=219
9+10+21+22+35+ kombinasyon toplam=97
9+10+21+22+79+ kombinasyon toplam=141
9+10+21+22+101+ kombinasyon toplam=163
9+10+21+35+79+ kombinasyon toplam=154
9+10+21+35+101+ kombinasyon toplam=176
9+10+21+79+101+ kombinasyon toplam=220
9+10+22+35+79+ kombinasyon toplam=155
9+10+22+35+101+ kombinasyon toplam=177
9+10+22+79+101+ kombinasyon toplam=221
9+10+35+79+101+ kombinasyon toplam=234
9+20+21+22+35+ kombinasyon toplam=107
9+20+21+22+79+ kombinasyon toplam=151
9+20+21+22+101+ kombinasyon toplam=173
9+20+21+35+79+ kombinasyon toplam=164
9+20+21+35+101+ kombinasyon toplam=186
9+20+21+79+101+ kombinasyon toplam=230
9+20+22+35+79+ kombinasyon toplam=165
9+20+22+35+101+ kombinasyon toplam=187
9+20+22+79+101+ kombinasyon toplam=231
9+20+35+79+101+ kombinasyon toplam=244
9+21+22+35+79+ kombinasyon toplam=166
9+21+22+35+101+ kombinasyon toplam=188
9+21+22+79+101+ kombinasyon toplam=232
9+21+35+79+101+ kombinasyon toplam=245
9+22+35+79+101+ kombinasyon toplam=246
10+20+21+22+35+ kombinasyon toplam=108
10+20+21+22+79+ kombinasyon toplam=152
10+20+21+22+101+ kombinasyon toplam=174
10+20+21+35+79+ kombinasyon toplam=165
10+20+21+35+101+ kombinasyon toplam=187
10+20+21+79+101+ kombinasyon toplam=231
10+20+22+35+79+ kombinasyon toplam=166
10+20+22+35+101+ kombinasyon toplam=188
10+20+22+79+101+ kombinasyon toplam=232
10+20+35+79+101+ kombinasyon toplam=245
10+21+22+35+79+ kombinasyon toplam=167
10+21+22+35+101+ kombinasyon toplam=189
10+21+22+79+101+ kombinasyon toplam=233
10+21+35+79+101+ kombinasyon toplam=246
10+22+35+79+101+ kombinasyon toplam=247
20+21+22+35+79+ kombinasyon toplam=177
20+21+22+35+101+ kombinasyon toplam=199
20+21+22+79+101+ kombinasyon toplam=243
20+21+35+79+101+ kombinasyon toplam=256
20+22+35+79+101+ kombinasyon toplam=257
21+22+35+79+101+ kombinasyon toplam=258
Dizideki rakamların toplamının yarısının tam sayıya yuvarlanmış degeri(hedef) : 150
Dizi'deki rakamların toplamı : 301
Hedef'e en yakın kombinasyon toplamı : 150
İlk gruptaki sayılar : 1+3+10+35+101+
Aşağıdaki küme için düşünürsek senin çözüm'un şu şekilde olacaktır;cgrszone dedi: ↑Aklıma daha farklı bir mantık geldi ama emin değilim denemek lazım. Şimdi 10 sayımız var ve bunları 5'erli 2 gruba ayıracak ve aradaki en küçük farkı bulacaksak sanki şöyle yapmak olur gibi (hala emin değilim denemek lazım):
Sayılar büyükten küçüğe sıralanır
En büyük sayı bir gruba ondan bir küçük olanı diğer gruba verilir.
Ardından sayılar dağıtıma şu şekilde başlanır. İki gruba verilen sayıların toplamlarına bakılır, toplamı büyük olan gruba kalanlardan en küçük olanı, toplamı küçük olana da en kalanlardan büyük sayı verilir.
Kalan sayılar bitince en yakın fark oluşmuş olur. (diye tahmin ediyorum :D)
Edit : Bir üstteki yorumu okumamıştım sanırım 3 aşağı 5 yukarı aynı olay :)
dizi :1 3 9 10 20 21 22 35 79 101
gr1 gr2
---- ----
101 79
1 35
22 3
9 21
20 10
gr1:153
gr2:148
aradaki fark 5
Fakat benim dediğim algoritmada;
1+3+10+35+101+
gr1 gr2
---- ----
101 79
35 22
10 21
3 20
1 9
gr1:150
gr2:151
aradaki fark 1
dolayısıyla daha yakın sonuç bulunabiliyor :)
aslına herkesin dediğini toplasak bişeyler olacak gibi :)
eve gidince bi programda ben yazmayı deneyim. bakıyım olacakmı. böyle kafadan yapınca tam emin olamıyorum kararsız kalıyorum. pratikte görmek lazım
eve gidince bi programda ben yazmayı deneyim. bakıyım olacakmı. böyle kafadan yapınca tam emin olamıyorum kararsız kalıyorum. pratikte görmek lazım
Evet sonradan fark ettim :) Biraz olasılık hesaplattırıp yakın sonuçları bulabilmek daha olası :)tambjk dedi: ↑Aşağıdaki küme için düşünürsek senin çözüm'un şu şekilde olacaktır;
dizi :1 3 9 10 20 21 22 35 79 101
gr1 gr2
---- ----
101 79
1 35
22 3
9 21
20 10
gr1:153
gr2:148
aradaki fark 5
Fakat benim dediğim algoritmada;
1+3+10+35+101+
gr1 gr2
---- ----
101 79
35 22
10 21
3 20
1 9
gr1:150
gr2:151
aradaki fark 1
dolayısıyla daha yakın sonuç bulunabiliyor :)
:) 10 elemanlı biri dizi için 252 farklı(5li kombinasyon) grup olasılığı var, yukarıda yazdığım algoritma 252 grup için elemanlarının toplamı alınıp kesin sonuca ulasılıyor .cgrszone dedi: ↑Evet sonradan fark ettim :) Biraz olasılık hesaplattırıp yakın sonuçları bulabilmek daha olası :)
işte bundan bahsediyordum. :Dtambjk dedi: ↑:) 10 elemanlı biri dizi için 252 farklı(5li kombinasyon) grup olasılığı var, yukarıda yazdığım algoritma 252 grup için elemanlarının toplamı alınıp kesin sonuca ulasılıyor .
benden önce davranılmış. :D
Küçük sayılardaki gruplar için kesin çözüm daha iyisi olamaz zaten. Ama sayı büyürse çok sıkıntılı bir hal alacağı kesin. Şimdi ki durum için en ideali
Soruyu sorduktan sonra ilk defa girebiliyorum dünden beri baya bi cevap yazılmış herkese çok teşekkür ederim:) Şimdi ben de incelemeye başlıyorum çözümleri, yeni fikirleri olup da ekleyen olursa çok memnun olurum.Maalesef algoritmaya gerektiği kadar önem verilmiyo, belki bu tarz sorularla dikkatleri de oraya çekmiş oluruz.
Ben kodunu yazdım. Gayet hızlı çalışıyor.
Çözüm için Permütasyondan faydalandım.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace GrupBul
{
class Program
{
private static int GenelToplam = 0;
private static int EnKucuk = int.MaxValue;
private static ArrayList Grup1Sayilar;
private static ArrayList Grup2Sayilar;
private static string Sonuc = "";
static void Main(string[] args)
{
//Değişkenler
const int Boyut = 10;
int[] Sayilar = new int[Boyut];
Grup1Sayilar = new ArrayList();
Grup2Sayilar = new ArrayList();
for (int i = 0; i < Boyut; i++)
{
Console.Write(i + 1 + ". Sayı = ");
Sayilar = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < Boyut; i++)
{
GenelToplam+= Sayilar ;
}
Console.WriteLine();
DateTime BaslangicZaman = DateTime.Now;
for (int i = 1; i < 10; i++)
{
PermutasyonHesapla<int>(Sayilar, i);
}
DateTime BitisZaman = DateTime.Now;
TimeSpan ts = BitisZaman - BaslangicZaman;
Console.WriteLine("------------------------------------------------");
for (int i = 0; i < Sayilar.Length; i++)
{
int SatirNo = Grup1Sayilar.IndexOf(Sayilar);
if (SatirNo == -1)
{
Grup2Sayilar.Add(Sayilar);
}
}
Sonuc="";
foreach (int value in Grup1Sayilar)
{
Sonuc += value.ToString() + "/";
}
Sonuc += " ";
foreach (int value in Grup2Sayilar)
{
Sonuc += value.ToString() + "/";
}
Console.WriteLine(String.Format("{0} = {1}", Sonuc, EnKucuk));
Console.WriteLine(ts.ToString());
Console.ReadLine();
}
static void PermutasyonHesapla<T>(IEnumerable<T> input, int count)
{
foreach (IEnumerable<T> permutation in Permute<T>(input, count))
{
int Grup1Toplam = 0;
ArrayList tmp = new ArrayList();
tmp.Clear();
foreach (T i in permutation)
{
Grup1Toplam += Convert.ToInt32(i);
tmp.Add(i);
}
int Grup2Toplam = GenelToplam - Grup1Toplam;
int Fark = Grup2Toplam - Grup1Toplam;
if (Fark<0)
{
Fark = Fark * -1;
}
if (Fark < EnKucuk)
{
EnKucuk = Fark;
Grup1Sayilar.Clear();
foreach (int value in tmp)
{
Grup1Sayilar.Add(value);
}
}
}
}
public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list, int count)
{
if (count == 0)
{
yield return new T[0];
}
else
{
int startingElementIndex = 0;
foreach (T startingElement in list)
{
IEnumerable<T> remainingItems = AllExcept(list, startingElementIndex);
foreach (IEnumerable<T> permutationOfRemainder in Permute(remainingItems, count - 1))
{
yield return Concat<T>(
new T[] { startingElement },
permutationOfRemainder);
}
startingElementIndex += 1;
}
}
}
public static IEnumerable<T> Concat<T>(IEnumerable<T> a, IEnumerable<T> b)
{
foreach (T item in a) { yield return item; }
foreach (T item in b) { yield return item; }
}
public static IEnumerable<T> AllExcept<T>(IEnumerable<T> input, int indexToSkip)
{
int index = 0;
foreach (T item in input)
{
if (index != indexToSkip) yield return item;
index += 1;
}
}
}
}
Çözüm için Permütasyondan faydalandım.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace GrupBul
{
class Program
{
private static int GenelToplam = 0;
private static int EnKucuk = int.MaxValue;
private static ArrayList Grup1Sayilar;
private static ArrayList Grup2Sayilar;
private static string Sonuc = "";
static void Main(string[] args)
{
//Değişkenler
const int Boyut = 10;
int[] Sayilar = new int[Boyut];
Grup1Sayilar = new ArrayList();
Grup2Sayilar = new ArrayList();
for (int i = 0; i < Boyut; i++)
{
Console.Write(i + 1 + ". Sayı = ");
Sayilar = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < Boyut; i++)
{
GenelToplam+= Sayilar ;
}
Console.WriteLine();
DateTime BaslangicZaman = DateTime.Now;
for (int i = 1; i < 10; i++)
{
PermutasyonHesapla<int>(Sayilar, i);
}
DateTime BitisZaman = DateTime.Now;
TimeSpan ts = BitisZaman - BaslangicZaman;
Console.WriteLine("------------------------------------------------");
for (int i = 0; i < Sayilar.Length; i++)
{
int SatirNo = Grup1Sayilar.IndexOf(Sayilar);
if (SatirNo == -1)
{
Grup2Sayilar.Add(Sayilar);
}
}
Sonuc="";
foreach (int value in Grup1Sayilar)
{
Sonuc += value.ToString() + "/";
}
Sonuc += " ";
foreach (int value in Grup2Sayilar)
{
Sonuc += value.ToString() + "/";
}
Console.WriteLine(String.Format("{0} = {1}", Sonuc, EnKucuk));
Console.WriteLine(ts.ToString());
Console.ReadLine();
}
static void PermutasyonHesapla<T>(IEnumerable<T> input, int count)
{
foreach (IEnumerable<T> permutation in Permute<T>(input, count))
{
int Grup1Toplam = 0;
ArrayList tmp = new ArrayList();
tmp.Clear();
foreach (T i in permutation)
{
Grup1Toplam += Convert.ToInt32(i);
tmp.Add(i);
}
int Grup2Toplam = GenelToplam - Grup1Toplam;
int Fark = Grup2Toplam - Grup1Toplam;
if (Fark<0)
{
Fark = Fark * -1;
}
if (Fark < EnKucuk)
{
EnKucuk = Fark;
Grup1Sayilar.Clear();
foreach (int value in tmp)
{
Grup1Sayilar.Add(value);
}
}
}
}
public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list, int count)
{
if (count == 0)
{
yield return new T[0];
}
else
{
int startingElementIndex = 0;
foreach (T startingElement in list)
{
IEnumerable<T> remainingItems = AllExcept(list, startingElementIndex);
foreach (IEnumerable<T> permutationOfRemainder in Permute(remainingItems, count - 1))
{
yield return Concat<T>(
new T[] { startingElement },
permutationOfRemainder);
}
startingElementIndex += 1;
}
}
}
public static IEnumerable<T> Concat<T>(IEnumerable<T> a, IEnumerable<T> b)
{
foreach (T item in a) { yield return item; }
foreach (T item in b) { yield return item; }
}
public static IEnumerable<T> AllExcept<T>(IEnumerable<T> input, int indexToSkip)
{
int index = 0;
foreach (T item in input)
{
if (index != indexToSkip) yield return item;
index += 1;
}
}
}
}
düzeltme
5'li 2 gruba göre düzenleme.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace GrupBul
{
class Program
{
private static int GenelToplam = 0;
private static int EnKucuk = int.MaxValue;
private static ArrayList Grup1Sayilar;
private static ArrayList Grup2Sayilar;
private static string Sonuc = "";
static void Main(string[] args)
{
//Değişkenler
const int Boyut = 10;
int[] Sayilar = new int[Boyut];
Grup1Sayilar = new ArrayList();
Grup2Sayilar = new ArrayList();
for (int i = 0; i < Boyut; i++)
{
Console.Write(i + 1 + ". Sayı = ");
Sayilar = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < Boyut; i++)
{
GenelToplam+= Sayilar ;
}
Console.WriteLine();
DateTime BaslangicZaman = DateTime.Now;
PermutasyonHesapla<int>(Sayilar, 5);
DateTime BitisZaman = DateTime.Now;
TimeSpan ts = BitisZaman - BaslangicZaman;
Console.WriteLine("------------------------------------------------");
for (int i = 0; i < Sayilar.Length; i++)
{
int SatirNo = Grup1Sayilar.IndexOf(Sayilar);
if (SatirNo == -1)
{
Grup2Sayilar.Add(Sayilar);
}
}
Sonuc="";
foreach (int value in Grup1Sayilar)
{
Sonuc += value.ToString() + "/";
}
Sonuc += " ";
foreach (int value in Grup2Sayilar)
{
Sonuc += value.ToString() + "/";
}
Console.WriteLine(String.Format("{0} = {1}", Sonuc, EnKucuk));
Console.WriteLine(ts.ToString());
Console.ReadLine();
}
static void PermutasyonHesapla<T>(IEnumerable<T> input, int count)
{
foreach (IEnumerable<T> permutation in Permute<T>(input, count))
{
int Grup1Toplam = 0;
ArrayList tmp = new ArrayList();
tmp.Clear();
foreach (T i in permutation)
{
Grup1Toplam += Convert.ToInt32(i);
tmp.Add(i);
}
int Grup2Toplam = GenelToplam - Grup1Toplam;
int Fark = Grup2Toplam - Grup1Toplam;
if (Fark<0)
{
Fark = Fark * -1;
}
if (Fark < EnKucuk)
{
EnKucuk = Fark;
Grup1Sayilar.Clear();
foreach (int value in tmp)
{
Grup1Sayilar.Add(value);
}
}
}
}
public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list, int count)
{
if (count == 0)
{
yield return new T[0];
}
else
{
int startingElementIndex = 0;
foreach (T startingElement in list)
{
IEnumerable<T> remainingItems = AllExcept(list, startingElementIndex);
foreach (IEnumerable<T> permutationOfRemainder in Permute(remainingItems, count - 1))
{
yield return Concat<T>(
new T[] { startingElement },
permutationOfRemainder);
}
startingElementIndex += 1;
}
}
}
public static IEnumerable<T> Concat<T>(IEnumerable<T> a, IEnumerable<T> b)
{
foreach (T item in a) { yield return item; }
foreach (T item in b) { yield return item; }
}
public static IEnumerable<T> AllExcept<T>(IEnumerable<T> input, int indexToSkip)
{
int index = 0;
foreach (T item in input)
{
if (index != indexToSkip) yield return item;
index += 1;
}
}
}
}
5'li 2 gruba göre düzenleme.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace GrupBul
{
class Program
{
private static int GenelToplam = 0;
private static int EnKucuk = int.MaxValue;
private static ArrayList Grup1Sayilar;
private static ArrayList Grup2Sayilar;
private static string Sonuc = "";
static void Main(string[] args)
{
//Değişkenler
const int Boyut = 10;
int[] Sayilar = new int[Boyut];
Grup1Sayilar = new ArrayList();
Grup2Sayilar = new ArrayList();
for (int i = 0; i < Boyut; i++)
{
Console.Write(i + 1 + ". Sayı = ");
Sayilar = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < Boyut; i++)
{
GenelToplam+= Sayilar ;
}
Console.WriteLine();
DateTime BaslangicZaman = DateTime.Now;
PermutasyonHesapla<int>(Sayilar, 5);
DateTime BitisZaman = DateTime.Now;
TimeSpan ts = BitisZaman - BaslangicZaman;
Console.WriteLine("------------------------------------------------");
for (int i = 0; i < Sayilar.Length; i++)
{
int SatirNo = Grup1Sayilar.IndexOf(Sayilar);
if (SatirNo == -1)
{
Grup2Sayilar.Add(Sayilar);
}
}
Sonuc="";
foreach (int value in Grup1Sayilar)
{
Sonuc += value.ToString() + "/";
}
Sonuc += " ";
foreach (int value in Grup2Sayilar)
{
Sonuc += value.ToString() + "/";
}
Console.WriteLine(String.Format("{0} = {1}", Sonuc, EnKucuk));
Console.WriteLine(ts.ToString());
Console.ReadLine();
}
static void PermutasyonHesapla<T>(IEnumerable<T> input, int count)
{
foreach (IEnumerable<T> permutation in Permute<T>(input, count))
{
int Grup1Toplam = 0;
ArrayList tmp = new ArrayList();
tmp.Clear();
foreach (T i in permutation)
{
Grup1Toplam += Convert.ToInt32(i);
tmp.Add(i);
}
int Grup2Toplam = GenelToplam - Grup1Toplam;
int Fark = Grup2Toplam - Grup1Toplam;
if (Fark<0)
{
Fark = Fark * -1;
}
if (Fark < EnKucuk)
{
EnKucuk = Fark;
Grup1Sayilar.Clear();
foreach (int value in tmp)
{
Grup1Sayilar.Add(value);
}
}
}
}
public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list, int count)
{
if (count == 0)
{
yield return new T[0];
}
else
{
int startingElementIndex = 0;
foreach (T startingElement in list)
{
IEnumerable<T> remainingItems = AllExcept(list, startingElementIndex);
foreach (IEnumerable<T> permutationOfRemainder in Permute(remainingItems, count - 1))
{
yield return Concat<T>(
new T[] { startingElement },
permutationOfRemainder);
}
startingElementIndex += 1;
}
}
}
public static IEnumerable<T> Concat<T>(IEnumerable<T> a, IEnumerable<T> b)
{
foreach (T item in a) { yield return item; }
foreach (T item in b) { yield return item; }
}
public static IEnumerable<T> AllExcept<T>(IEnumerable<T> input, int indexToSkip)
{
int index = 0;
foreach (T item in input)
{
if (index != indexToSkip) yield return item;
index += 1;
}
}
}
}
Arkadaslar, oncelikle permutasyon cozumu yanlis degildir ama algorithm complexity (http://en.wikipedia.org/wiki/Analysis_of_algorithms) acisindan dusununce dogruda degildir. Soyle ki eger 1000000 elemanli bir diziyi boyle tum altkumelerini bulurum sonrada karsilastiririm demek bir sonuca goturmeyecegi icin dogru kabul edilmez. Bilgisayarin isi ne hesaplasin dursun dersenizde olmaz kanaatindeyim.
Sorunun cevabina gelince, ilk sayfadaki cevaplar biraz yaklasmis gibi, bence (daha guzel bir cozum olabilir) cevap su sekilde.
A ve B kumemiz bos olsun:
toplam_A = 0
toplam_B = 0
Girilen N eleman ince siralanir
Dizide eleman oldugu surece:
Eger toplam_A <= toplam_B ise , dizideki en buyuk elemani diziden cikar ve A kumesine ekle, degilse en kucuk elemani diziden cikar ve A kumesine ekle,
toplam_A= toplam_A+ A_ya_eklenen_yeni_eleman
Eger toplam_B <= toplam_A ise , dizideki en buyuk elemani diziden cikar ve B kumesine ekle, degilse en kucuk elemani diziden cikar ve B kumesine ekle,
toplam_B= toplam_B+ B_ye_eklenen_yeni_eleman
donu_sonu
Sorunun cevabina gelince, ilk sayfadaki cevaplar biraz yaklasmis gibi, bence (daha guzel bir cozum olabilir) cevap su sekilde.
A ve B kumemiz bos olsun:
toplam_A = 0
toplam_B = 0
Girilen N eleman ince siralanir
Dizide eleman oldugu surece:
Eger toplam_A <= toplam_B ise , dizideki en buyuk elemani diziden cikar ve A kumesine ekle, degilse en kucuk elemani diziden cikar ve A kumesine ekle,
toplam_A= toplam_A+ A_ya_eklenen_yeni_eleman
Eger toplam_B <= toplam_A ise , dizideki en buyuk elemani diziden cikar ve B kumesine ekle, degilse en kucuk elemani diziden cikar ve B kumesine ekle,
toplam_B= toplam_B+ B_ye_eklenen_yeni_eleman
donu_sonu
Kafa yormadım, yeterince yorgun zaten :)) ama şu düşüncenin size katkısı olabilir, on sayının da birbirleriyle aralarındaki farklara bakıp, bu farklar üzerinden işlem yapmayı da işin içine katsak?
o lafı eden benim, "işi ne hesaplasın dursun"... :Dsithlord dedi: ↑Arkadaslar, oncelikle permutasyon cozumu yanlis degildir ama algorithm complexity (http://en.wikipedia.org/wiki/Analysis_of_algorithms) acisindan dusununce dogruda degildir. Soyle ki eger 1000000 elemanli bir diziyi boyle tum altkumelerini bulurum sonrada karsilastiririm demek bir sonuca goturmeyecegi icin dogru kabul edilmez. Bilgisayarin isi ne hesaplasin dursun dersenizde olmaz kanaatindeyim.
Sorunun cevabina gelince, ilk sayfadaki cevaplar biraz yaklasmis gibi, bence (daha guzel bir cozum olabilir) cevap su sekilde.
A ve B kumemiz bos olsun:
toplam_A = 0
toplam_B = 0
Girilen N eleman ince siralanir
Dizide eleman oldugu surece:
Eger toplam_A <= toplam_B ise , dizideki en buyuk elemani diziden cikar ve A kumesine ekle, degilse en kucuk elemani diziden cikar ve A kumesine ekle,
toplam_A= toplam_A+ A_ya_eklenen_yeni_eleman
Eger toplam_B <= toplam_A ise , dizideki en buyuk elemani diziden cikar ve B kumesine ekle, degilse en kucuk elemani diziden cikar ve B kumesine ekle,
toplam_B= toplam_B+ B_ye_eklenen_yeni_eleman
donu_sonu
Bir teori var, adını, yada yaratıcısını bilmiyorum.
Bilgisayar sistemlerinin hızlarının nihayi sonucu ile ilgili, her yıl bilmem kaç kat artıyormuş. (acayip uykuluyum, rakam falan yok gözümde hatırlayamıyorum)
Benim bir yazılımcı olarak fikrim, zaman ve bu birim zamanda belirli bir miktarda bilgiyi işleyebilen insan beyni hemen hemen aynı kalıcak fakat milyarlarca kat hızlı işlemciler var olucak.
öyle bir dünyada nihayi sorun, algoritmanın hızı değil, nitelik yapısı mümkünlüğü işaret eden varlık sınırları içinde ve somut sonuca götüren kod yapısının dil sınırlarına bağlı kalınarak tasarımı ve yazımıdır. ;)
yani 10000000000000 değil 1000000000000000000000000000000'de olsa o rakam, bir gün gelicek ve sadece yukarıda verdiğim yerine koyma algoritmasıyla bile sonuca gidilicek.
şimdilik 10 rakam iyidir, candır, teknoloji ilerledikçe rakamı arttırırız.
o vakte kadar da ne olur sonuç elde edilen şeyin verimliliğinden kuşku duymayın, bu paranoya başlangıcı semptomudur zaten. :D
:) Bastan soyleyeyim, kimseyi gucendirmek gibi bir niyetim yok, eger gucendirdiysem ozur dilerim. Ozellikle seni kastederek soylememistim zaten, sanirim bahsettigin yasa moore yasasi (http://tr.wikipedia.org/wiki/Moore_Yasas%C4%B1) ama o bakin bilgisayarlar ileride cok hizlanacak algoritmalarin ne kadar verimli oldugu cok onemli degil manasinda soylenmis bir cumle degil diye dusunuyorum.LeaveNhA dedi: ↑o lafı eden benim, "işi ne hesaplasın dursun"... :D
Benim demek istedigim algoritma sorularinin tamamina yakini zaten brute force denen , tum ihtimalleri deneyerek bulma yontemiyle cozulebilir ama aranan cevap bu degildir. Yok 10 elemanli soru icin benim cozumum dogru, milyonlarca eleman icinde bekleyin cok hizil iclemciler cikinca cozersiniz demekte bir secenek tabi.
@LeaveNhA Bahsettiğin şey moore yasası :) Ama şu an moore yasasının da belirlediği sınır aşılmış durumda :) Teknolojik ilerleme ivmesi eskiye nazaran tahmin edilenden çok daha hızlı...
Edit : Üstteki arkadaşla aynı anda yazmışız :)
Edit : Üstteki arkadaşla aynı anda yazmışız :)
