C#nedir?com Homepage
Forum Home Forum Home > C# / .NET > C#
  New Posts New Posts RSS Feed - Sayı dizisinde Kombinasyon Kurma ???
  FAQ FAQ  Forum Search   Events   Register Register  Login Login

Sayı dizisinde Kombinasyon Kurma ???

 Post Reply Post Reply
   

Author
Message
asddsaasd View Drop Down
Newbie
Newbie


Joined: 08 Ocak 2013
Status: Offline
Points: 6
Post Options Post Options   Thanks (0) Thanks(0)   Quote asddsaasd Quote  Post ReplyReply Direct Link To This Post Topic: Sayı dizisinde Kombinasyon Kurma ???
    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.


Edited by asddsaasd - 08 Ocak 2013 at 17:48
Back to Top
fizikçi View Drop Down
Senior Member
Senior Member


Joined: 04 Eylül 2012
Status: Offline
Points: 438
Post Options Post Options   Thanks (0) Thanks(0)   Quote fizikçi Quote  Post ReplyReply Direct Link To This Post 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.
Back to Top
asddsaasd View Drop Down
Newbie
Newbie


Joined: 08 Ocak 2013
Status: Offline
Points: 6
Post Options Post Options   Thanks (0) Thanks(0)   Quote asddsaasd Quote  Post ReplyReply Direct Link To This Post Posted: 10 Ocak 2013 at 14:12

fizikçi ilgine teşekkür ederim. Ancak istediğim bu değil. Sanırım ben tam olarak anlatamadım. Şöyleki;


int limitimiz = 100;
int[] dizimiz = {15,87,6,2,4,9,3,5,5,47,58,65,21,vs vs};
Dizimiz rasgele sayılardan oluşabilir, birbirinin aynı olabilir,limitten küçük ya da eşit olabilir.
Örneğin;

int[] dizimiz = {41,90,9,6,99,41,4,6,3,98,100}
Dizisinde limite en yakın ya da eşit kombinasyonları bulmalıyım.
41+41+9+6+3 = 100
90+6+4 = 100
100 = 100
99 <= 100
98 <= 100
 
Yani en yakın sonuçları bulup diziden silmeli, kalanlarla tekrar kontrol yaparak  son elemana kadar devam etmeliyim. Yardımınız için Teşekkür ederim.
Back to Top
kaan235 View Drop Down
Groupie
Groupie


Joined: 03 Kasım 2010
Status: Offline
Points: 55
Post Options Post Options   Thanks (0) Thanks(0)   Quote kaan235 Quote  Post ReplyReply Direct Link To This Post 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
}

               }
               }
              
            }
        }
Back to Top
asddsaasd View Drop Down
Newbie
Newbie


Joined: 08 Ocak 2013
Status: Offline
Points: 6
Post Options Post Options   Thanks (0) Thanks(0)   Quote asddsaasd Quote  Post ReplyReply Direct Link To This Post 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.
Back to Top
psikomoder View Drop Down
Senior Member
Senior Member


Joined: 27 Haziran 2011
Location: Turkey
Status: Offline
Points: 508
Post Options Post Options   Thanks (0) Thanks(0)   Quote psikomoder Quote  Post ReplyReply Direct Link To This Post Posted: 14 Ocak 2013 at 18:34
http://www.developerfusion.com/tools/convert/vb-to-csharp/

mesela :D daha fazlası için google amca ya danısınız :D
Back to Top
asddsaasd View Drop Down
Newbie
Newbie


Joined: 08 Ocak 2013
Status: Offline
Points: 6
Post Options Post Options   Thanks (0) Thanks(0)   Quote asddsaasd Quote  Post ReplyReply Direct Link To This Post 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?
Back to Top
psikomoder View Drop Down
Senior Member
Senior Member


Joined: 27 Haziran 2011
Location: Turkey
Status: Offline
Points: 508
Post Options Post Options   Thanks (0) Thanks(0)   Quote psikomoder Quote  Post ReplyReply Direct Link To This Post 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 
Back to Top
asddsaasd View Drop Down
Newbie
Newbie


Joined: 08 Ocak 2013
Status: Offline
Points: 6
Post Options Post Options   Thanks (0) Thanks(0)   Quote asddsaasd Quote  Post ReplyReply Direct Link To This Post 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.
Back to Top
psikomoder View Drop Down
Senior Member
Senior Member


Joined: 27 Haziran 2011
Location: Turkey
Status: Offline
Points: 508
Post Options Post Options   Thanks (0) Thanks(0)   Quote psikomoder Quote  Post ReplyReply Direct Link To This Post Posted: 15 Ocak 2013 at 12:26
jagged ne onu anlamadım. 
Back to Top
asddsaasd View Drop Down
Newbie
Newbie


Joined: 08 Ocak 2013
Status: Offline
Points: 6
Post Options Post Options   Thanks (0) Thanks(0)   Quote asddsaasd Quote  Post ReplyReply Direct Link To This Post 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


Edited by asddsaasd - 15 Ocak 2013 at 15:25
Back to Top
psikomoder View Drop Down
Senior Member
Senior Member


Joined: 27 Haziran 2011
Location: Turkey
Status: Offline
Points: 508
Post Options Post Options   Thanks (0) Thanks(0)   Quote psikomoder Quote  Post ReplyReply Direct Link To This Post 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 :)
Back to Top
lucyming View Drop Down
Newbie
Newbie


Joined: 10 Mayıs 2013
Status: Offline
Points: 3
Post Options Post Options   Thanks (0) Thanks(0)   Quote lucyming Quote  Post ReplyReply Direct Link To This Post Posted: 10 Mayıs 2013 at 11:17
Yardımlarınız için teşekkür ederim.


__________________________________________________
Diablo 3 Gold;Aion Kinah;Diablo 3 Gold Kaufen;Guild Wars 2 Gold
Back to Top
crazzybaron View Drop Down
Senior Member
Senior Member


Joined: 09 Haziran 2010
Status: Offline
Points: 801
Post Options Post Options   Thanks (0) Thanks(0)   Quote crazzybaron Quote  Post ReplyReply Direct Link To This Post Posted: 10 Mayıs 2013 at 17:40
bir kelime bir işlem programı mı yapıyorsun?
MVP yolunda.......
Back to Top
packexs View Drop Down
Newbie
Newbie


Joined: 12 Temmuz 2021
Location: Istanbul
Status: Offline
Points: 3
Post Options Post Options   Thanks (0) Thanks(0)   Quote packexs Quote  Post ReplyReply Direct Link To This Post 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.
Back to Top
 Post Reply Post Reply
  Share Topic   
   


Forum Jump Forum Permissions View Drop Down

Forum Software by Web Wiz Forums® version 11.01
Copyright ©2001-2014 Web Wiz Ltd.