Print Page | Close Window

Sayı dizisinde Kombinasyon Kurma ???

Printed From: C#nedir?com
Category: C# / .NET
Forum Name: C#
Forum Description: .NET Platformunun gözde dili
URL: http://forum.csharpnedir.com/forum_posts.asp?TID=52542
Printed Date: 28 Ekim 2021 at 01:51
Software Version: Web Wiz Forums 11.01 - http://www.webwizforums.com


Topic: Sayı dizisinde Kombinasyon Kurma ???
Posted By: asddsaasd
Subject: Sayı dizisinde Kombinasyon Kurma ???
Date Posted: 08 Ocak 2013 at 17:47
Arkadaşlar Merhaba,
 
int dizi[] = {1,2,32,3,6,87,35,56,98,32,22,1,... vs}
 
Toplamları 101den küçük ve 100 en yakın olanlarını bulup listeden çıkarıp hiçbir sayı kalmayana dek aynı işlemi yapmak istiyorum.
 
Örneğin ;
int dizi[] = {85,32,8,45,12,7,18,8,50,7,99} dizisinde

85+7+8
 
int dizi[] = {32,45,12,18,50,7,8,99} dizisinde

32+50+18
int dizi[] = {45,12,7,8,99} dizisinde

45+7+8+12
 
int dizi[] = {99} dizisinde

99
 
gibi dizinin son elemanına kadar gruplama yaparak devam etmeliyim. Ancak kafamda birtürlü oluşturamadım. Seçeceğim kombinasyondan daha uygun bir kombinasyonun olmaması gerekiyor. Yardımlarınız için teşekkür ederim.



Replies:
Posted By: fizikçi
Date Posted: 08 Ocak 2013 at 20:23
int[] diz = { 34, 54, 2, 4, 6, 76, 99, 82, 46, 79, 90 };
        List<int> sirali = new List<int>();
       
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < diz.Length; i++)
            {
               sirali.Add(diz);
            }
            sirali.Sort();

            while (sirali.Count > 0)
            {
               int uzun = sirali.Count;
               int toplam = sirali[uzun - 1];

               for (int i = 0; i < uzun; i++)
               {
                    toplam += sirali;
                   
                    if (toplam == 100)
                    {
                        sirali.RemoveAt(uzun - 1);
                        sirali.RemoveRange(0, i);
                        break;
                    }
                    else if (toplam > 100&&i==0)
                    {
                        sirali.RemoveAt(uzun - 1);
                        break;
                    }
                    else if (toplam > 100)
                    {
                        if (!testEt(i, toplam))
                            sonCare(i, toplam);
                        break;
                    }
               }

            }


        }

        bool testEt(int sira,int toplam)
        {
            bool sonuc = false;
            int fark = toplam - 100;
            for (int i = 0; i <= sira; i++)
            {
               if (sirali == fark)
               {
                    sirali.RemoveAt(sirali.Count - 1);
                    sirali.RemoveRange(0, i);
                    sirali.RemoveRange(1, sira - i);
                    sonuc = true;
                    break;
               }
            }
            return sonuc;
        }

        void sonCare(int sira, int toplam)
        {
            int fark = 100 - sirali[sirali.Count - 1];
            if (fark < sirali[sirali.Count / 2])
            {
               for (int i = 0; i < sirali.Count / 2; i++)
               {
                    if (fark == sirali)
                    {
                        sirali.RemoveAt(sirali.Count - 1);
                        sirali.RemoveAt(i);
                        return;
                        
                    }
               }

               for (int i = 0; i < sirali.Count / 2; i++)
               {
                    if (sirali > fark)
                    {
                        sirali.RemoveAt(sirali.Count - 1);
                        sirali.RemoveAt(i - 1);
                        return;
                    }
               }


            }
            else
            {
               for (int i = sirali.Count / 2; i < sirali.Count; i++)
               {
                    if (fark == sirali)
                    {
                        sirali.RemoveAt(sirali.Count - 1);
                        sirali.RemoveAt(i);
                        return;
                    }
               }
               for (int i = 0; i < sirali.Count / 2; i++)
               {
                    if (sirali > fark)
                    {
                        sirali.RemoveAt(sirali.Count - 1);
                        sirali.RemoveAt(i - 1);
                        return;
                    }
               }
            }

        }


belki işine yarar, en azından fikir verir. unutmadan söyleyeyim eğer dizide kalan elemanları toplamı 100 ü bulmazsa while sonsuz döngüye girer. uygun bir yerde bu kontrolü yaparsan.


Posted By: asddsaasd
Date Posted: 10 Ocak 2013 at 14:12

http://www.csharpnedir.com/forum2/member_profile.asp?PF=22720&FID=15 -



Posted By: kaan235
Date Posted: 11 Ocak 2013 at 01:06

private void 3lü kombinasyon()
        {
int [] dizi = {};
            int toplam,fazlalık;
            for (int i = 0; i < dizi.Length; i++)
            {
               for (int a = 0; a < dizi.Length; a++)
               {
                  
     for (int b = 0; b < dizi.Length;b++)
               {
                  if((i!=a)&(a!=b)&(i!=b))
{
toplam= dizi+dizi[a]+dizi;
fazlalık = 100-toplam;
//burdan sonrası sana kalmış işter fazlalık -1 ıle 1 arasını yazdırt ıster en yakını bul iyi forumlar
}

               }
               }
              
            }
        }


Posted By: asddsaasd
Date Posted: 14 Ocak 2013 at 16:01
Hepinize teşekkür ederim. Finallerim sebebiyle birkaç gündür giremedim foruma. Aynı soruyu farklı forumlarda da sordum şöyle bir vb kodu önerdiler. Bunu cs versiyona nasıl dönüştürürüm.
 
 
        Private comb()() As Integer
dim int[] dizim = {1,2,3,4,5,6,7,1,22,3,5,66,74};
dim int limit = 100;
Dim temp(dizim.GetUpperBound(0)) As Integer
Dim q, w, z, x, y As Integer
Dim i, j, k As Integer
For i = 0 To dizim.GetUpperBound(0)
 temp(i) = dizim(i)
Next
Array.Sort(temp)
Array.Reverse(temp)
ReDim comb(0)(0)
For i = 0 To temp.GetUpperBound(0)
 x = -1
 y = -1
 For j = 0 To q
  w = comb(j).GetUpperBound(0)
  z = 0
  For k = 0 To w
   z += comb(j)(k)
  Next
  If y < z AndAlso z + temp(i) <= limit Then
   y = z
   x = j
  End If
 Next
 If x = -1 Then
  ReDim Preserve comb(q + 1)
  q += 1
  ReDim comb(q)(1)
  w = 0
  comb(q)(w) = temp(i)
 Else
  w = comb(x).GetUpperBound(0)
  ReDim Preserve comb(x)(w + 1)
  comb(x)(w) = temp(i)
 End If
Next
For i = 0 To q
 For j = 0 To comb(i).GetUpperBound(0)
  If comb(i)(j) = 0 Then
   ReDim Preserve comb(i)(j - 1)
  End If
 Next
Next
 
Csharpta redim preverse nasıl yapabilirim. Haftaya teslim etmem gerekiyor.
Yardımlarınız için teşekkür ederim.


Posted By: psikomoder
Date Posted: 14 Ocak 2013 at 18:34
http://www.developerfusion.com/tools/convert/vb-to-csharp/ - http://www.developerfusion.com/tools/convert/vb-to-csharp/

mesela :D daha fazlası için google amca ya danısınız :D


Posted By: asddsaasd
Date Posted: 15 Ocak 2013 at 01:24
Redim preverse csharpta nasıl oluyor. Ayrıca jagged dizinin satır sayısını işlemler sonunda elde edeceğim. Jaggedde dizi satır sayısını ihtiyaca göre nasıl değiştirebilirim.

 
psikomoder redim preverse'i google amcaya soracaksam bunu niye sana sordum ki?


Posted By: psikomoder
Date Posted: 15 Ocak 2013 at 01:32
ahhh ahh :) sen benim verdiğim linke baktın mı ben donuşturme işlemi için link vermiştim daha fazla donuşturme sitesi için google amcaya danışınız derken esprili bir sekilde söyleyeyim dedim olmadı :D 


Posted By: asddsaasd
Date Posted: 15 Ocak 2013 at 12:02
Psikomoder üzgünüm dostum. Kodu çözemeyince biraz daraldım herhalde, yanlış anladım. Kusura bakmayın. Yardımınız için de teşekkür ederim.
Jaggedi csharpta nasıl yeniden boyutlandıracağımı bulamadım, bunaldım.


Posted By: psikomoder
Date Posted: 15 Ocak 2013 at 12:26
jagged ne onu anlamadım. 


Posted By: asddsaasd
Date Posted: 15 Ocak 2013 at 15:25

Jagged dizi, satır sayısı belli sutun sayısı belirsiz diziler. (Düzensiz diziler)

int satirsayi = 3;
double[][] jaggeddizi = new double[satirsayi][];


jaggeddizi[0] = new double[2];
jaggeddizi[1] = new double[3];
jaggeddizi[2] = new double[4];


jaggeddizi[0][0] = 7.5;
jaggeddizi[0][1] = 10.1;


jaggeddizi[1][0] = 7.5;
jaggeddizi[1][1] = 1.5;
jaggeddizi[1][2] = 4.6;


jaggeddizi[2][0] = 7.6;
jaggeddizi[2][1] = 4.2;
jaggeddizi[2][2] = 1234.85;
jaggeddizi[2][3] = 15.7;

Ancak işlem anında benim jagged dizisini yeniden boyutlandırmam gerekli ve mevcut verileri kaybetmemeliyim.
Yani başta 3 satır olarak oluşturduğum diziyi sonradan gereğine göre arttırmam ya da azaltmam gerekmekte. Arttırma için vbdeki redim veri kaybetmemek içinde preserve yapmalıyım. Ama nasıl? :S


Posted By: psikomoder
Date Posted: 15 Ocak 2013 at 15:41
Array.Resize(ref comb(i), j);

bak sana verdiğim linkteki donuşturucude o redim reverse satırını donuşturdum.
verdiği sonuç bu :)


Posted By: lucyming
Date Posted: 10 Mayıs 2013 at 11:17
Yardımlarınız için teşekkür ederim.


__________________________________________________
http://www.mmobf.com/ - Diablo 3 Gold ; http://www.mmobf.com/aion-kinah-566/ - Aion Kinah ; http://www.mmobf.com/ - Diablo 3 Gold Kaufen ; http://www.mmobf.com/Guild-Wars-2/ - Guild Wars 2 Gold


Posted By: crazzybaron
Date Posted: 10 Mayıs 2013 at 17:40
bir kelime bir işlem programı mı yapıyorsun?

-------------
MVP yolunda.......


Posted By: packexs
Date Posted: 13 Temmuz 2021 at 02:15
Merhaba
Bir integer dizimiz var. 20 elemanlı. Bu dizi elemanları yaklaşık 50 civarı olacak. Toplamları 100 ü veren 2 ya da 3 lü kominasyona sokacağım. Toleransımız artı ve ekside 2. Yani 98 ve üstü 102 ve altı kabul edilecek. Öncelikli 2 daha sonra 3 lü tercihinde bulunmam gerekiyor.
Bir kombinasyon kodu yazdım fakat sıkıntım şu şekilde.
Dizi elemanlarının içinde diyelim ki 48 den 2 tane var. 50 den de 2 tane var. Benim kodum 50 ve 50 yi alıp listeme atıyor ve bu 50 leri kombinasyon dizisinden çıkarıyor. 48 ve 48 toplamı 96 yaptığından 98 ve üstü kabul şartına uymuyor. Halbuki 48 ve 50 alıp diğer 48 ve 50 yi alıp listeme atsa 2 adet kombinasyon seçeneğini de elemiş olacaktım. Diğer bir deyişle bu 2 50 yi alırsam bunlarla diğer sayılardan da toplam 100 +-2 kuralına uyacak kombinasyonlar oluşabilir en iyisi ben tam 100 olacak kombinasyon yapmayayım da 100e yakın kombinasyon çıkarayım ve bundan sonra bu sayılarla daha fazla kombinasyon üretebilirim diyebilecek bir algoritma gereksinimim var.

Konu ile ilgili yardımda bulunabilecek arkadaş var mı aramızda?

Teşekkür ederim.



Print Page | Close Window

Forum Software by Web Wiz Forums® version 11.01 - http://www.webwizforums.com
Copyright ©2001-2014 Web Wiz Ltd. - http://www.webwiz.co.uk