İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Sinema Dizi Akıllı Ev Motosiklet Mikromobilite Kripto Para Sağlık Teknolojileri Son dakika Yazarlar
  1. Ana sayfa
  2. SDN Forum
  3. Programlama
  4. Programlama Dilleri
Programlama Dilleri

Algoritma sorunu

killbillgates15.08.201275 cevap9.350 görüntüleme
#31
Aklımda bir yöntem var ama yazarak anlatması uzun sürer sanırım. Zor geliyo anlatması şu an :D
Cevaplar
#32
cgrszone dedi: ↑
Aklımda bir yöntem var ama yazarak anlatması uzun sürer sanırım. Zor geliyo anlatması şu an :D
ben çözerim bu işi, ama önce gidip klavye almam gerek, harbi benimle yaşıt bu, yazmıyorrrrr... :(
#33
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.
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.
#34
cgrszone dedi: ↑
Aklımda bir yöntem var ama yazarak anlatması uzun sürer sanırım. Zor geliyo anlatması şu an :D
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!! :D
#35
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?
10 sayının 5'li bütün alt kümelerini bulursun.
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.
#36
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.
onu 100 sayı olunca düşünürüz biz gene... ;)

şimdi on sayıyla neler yapcaz ona bakalım...
#37
Ş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.
#38
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.
#39
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 :)
#40
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)
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 :)
#41
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 :)
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 :)
#42
__kadıköyRAP__ dedi: ↑
Böyle yılan şeklinde gitmeyi dene emin edeğilim belki tutar.

Program şu şekilde oluyor ...

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 :)
#43
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.
#44
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.
Benim önerdiğimi kağıt kalem ile alakasız sayılarla dene istersen. Olabilecek en yakın sonuç alınıyor :)
#45
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();


#46
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.
Çözümü;

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+
#47
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 :)
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 :)
#48
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
#49
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 :)
Evet sonradan fark ettim :) Biraz olasılık hesaplattırıp yakın sonuçları bulabilmek daha olası :)
#50
cgrszone dedi: ↑
Evet sonradan fark ettim :) Biraz olasılık hesaplattırıp yakın sonuçları bulabilmek daha olası :)
:) 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 .
#51
tambjk 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 .
işte bundan bahsediyordum. :D
benden önce davranılmış. :D
#52
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
killbillgates Konuyu açan
#53
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.
#54
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;
}
}
}
}

#55
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;
}
}
}
}
#56
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
#57
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?
#58
sithlord 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
o lafı eden benim, "işi ne hesaplasın dursun"... :D
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
#59
LeaveNhA dedi: ↑
o lafı eden benim, "işi ne hesaplasın dursun"... :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.

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.
#60
@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 :)

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.