راکت
amir
amir
توسط amir مطرح شد
حل
9 پاسخ

الگوریتم این سوال

سلام دوستان عزیز
این سوال رو من خیلی روش فکر کردم منتها فک کنم به الگوریتم بازگشتی نیاز داره ولی هرکاری کردم حل نشد میشه بیزحمت نحوه حلش رو بفرمایید تشکر


ثبت پرسش جدید
مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi4 سال پیشمطرح شد
0

بله الان مجدد چک کردم دیدم روشم اشتباه بود، تلاشم این بود که راه بهینه تری ارائه کنم که موفق نبود
این کد تمام حالت های ممکن رو چک میکنه به همین دلیل بهینه نیست ولی فکر میکنم جواب درست تولید کنه

public $total = 1000;
public $coins = [100,300,500];
public $sum=[];
function rec($array,$total,$old){
    foreach ($array as $key=>$value){
        unset($array[$key]);
        for($i=floor($total/$value);$i>=0;$i--){
            $remain = $total-$i*$value;
            $old[$value]= $i;
            if ($remain==0){
                if (array_sum($old) >0){
                    $this->sum[implode(",",array_keys($old))."-".implode(",",array_values($old))] = $old;
                }
                $old =[];
            }
            elseif($remain<0){
                $old =[];
            }
                $this->rec($array,$remain,$old);
        }
    }
}

public function test()
{
    $this->rec($this->coins,$this->total,[]);
    echo json_encode($this->sum);
}

خروجی:

{
   "100-10":{
      "100":10
   },
   "100,300-7,1":{
      "100":7,
      "300":1
   },
   "100,300,500-5,0,1":{
      "100":5,
      "300":0,
      "500":1
   },
   "100,300-4,2":{
      "100":4,
      "300":2
   },
   "100,300,500-2,1,1":{
      "100":2,
      "300":1,
      "500":1
   },
   "100,300-1,3":{
      "100":1,
      "300":3
   },
   "100,300,500-0,0,2":{
      "100":0,
      "300":0,
      "500":2
   }
}

IrajJavidan
IrajJavidan
@IrajJavidan14 سال پیشمطرح شد
0

بزرگترین a که از n کوچکتر هست رو پیدا کن
از n
a رو کم کن
همین کار رو، روی n باقی مانده انجام بده
حالا اگه در نهایت n صفر شد، که امکان پذیره، اگه نه هم که امکان پذیر نیست
درباره ج) نظری ندارم


amir
amir
تخصص :بک اند و فرانت اند
@behzadi4 سال پیشمطرح شد
0

خب عزیز مشکله اینه که میتونیم مثلا ۵ تا سکه a1 استفاده کنیم محدودیتی برای تعداد استفاده از یک سکه نیست یک مثال ساده میزنم یه اسکناس ۱۰۰۰ داریم میخایم با سکه ۲۰۰ و ۳۰۰ خورد کنیم برا همین میتونیم ۵تا۲۰۰ تومنی استفاده کنیم یا ۲تا۳۰۰تومنی با ۲ تا ۲۰۰ تومنی منظورم اینجوریه واقعا بدجور درگیرشم ممنون میشم کمک کنین
@IrajJavidan1 @farhadi @mehranmarandi90 @Alimotreb @ali.bayat @mehdi.mahdavi97 @ajdar9667 @gomnam


IrajJavidan
IrajJavidan
@IrajJavidan14 سال پیشمطرح شد
0

@behzadi گفتم که،
درباره ج نظری ندارم


IrajJavidan
IrajJavidan
@IrajJavidan14 سال پیشمطرح شد
0

روشی که گفتم اشتباهه


مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi4 سال پیشمطرح شد
0

این کد با کال کردن متد test() میتونه خروجی رو تولید کنه

public $total = 1000;
public $coins = [100,200,500];
public $sum=[];

function recursive($old,$index,$count,$total){
    $remain = $total-($this->coins[$index]*$count);

        if ($count>0){
            $old = $old ." | ".$this->coins[$index]." * ".$count;
        }

    if ($remain==0){
        $this->sum[]=trim($old," |");
        $old ='';
        if ($count >1){
            $this->recursive($old,$index,$count-1,$this->total);
        }if ($index>0){
            $index--;
            $count = round($this->total/$this->coins[$index]);
            for($j=$count;$j>=0;$j--){
                $this->recursive($old,$index,$j,$this->total);
            }
        }
    }elseif ($remain < 0){
        $old ='';
        if ($count>1){
            $this->recursive($old,$index,$count-1,$this->total);
        }elseif ($index>0){
            $index--;
            $count = floor($this->total/$this->coins[$index]);
            $this->recursive($old,$index,$count,$this->total);
        }
    }elseif ($remain > 0){
        if ($index>0){
            $index--;
            $count = floor($remain/$this->coins[$index]);
            for($j=$count;$j>=0;$j--){
                $this->recursive($old,$index,$j,$remain);
            }
        }
    }

}
public function test()
{
        $index = count($this->coins)-1;
        $count = round($this->total/$this->coins[$index]);
        $this->recursive("",$index,$count,$this->total);
        echo json_encode($this->sum).PHP_EOL;
        echo count($this->sum)>0?"امکان پذیر است ":"خیر امکان پذیر نیست".PHP_EOL;
        echo count($this->sum) . "تعداد روش های انجام: ".PHP_EOL;
}

یه هچین خرویجی تولید میشه

[
   "500 * 2",
   "500 * 1 | 200 * 2 | 100 * 1",
   "500 * 1 | 200 * 1 | 100 * 3",
   "500 * 1 | 200 * 0 | 100 * 5",
   "200 * 5",
   "200 * 4 | 100 * 2",
   "100 * 10",
   "200 * 4 | 100 * 2",
   "200 * 3 | 100 * 4",
   "200 * 2 | 100 * 6",
   "200 * 1 | 100 * 8",
   "100 * 10"
]"
امکان پذیر است
 12تعداد روش های انجام":

amir
amir
تخصص :بک اند و فرانت اند
@behzadi4 سال پیشمطرح شد
0

مهران جان واقعا تشکر از وقتی که گذاشتی ولی مثلا من سکه 200 تومنی و 300 تومنی میزنم مثلا دوتا 200 و 2 تا 300 رو حساب نمی کنه @mehranmarandi90


amir
amir
تخصص :بک اند و فرانت اند
@behzadi4 سال پیشمطرح شد
0

@mehranmarandi90 اگر امکان داره یه راه ارتباطی هم معرفی کنین ممنون میشم


مهسا
مهسا
@mahsa4 سال پیشمطرح شد
0

سلام دوستان. یه سوال قبل این سوالم ببینید .ثواب داره😓 سوال مرتب سازی آرایه شی


مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi4 سال پیشمطرح شد
0

بله الان مجدد چک کردم دیدم روشم اشتباه بود، تلاشم این بود که راه بهینه تری ارائه کنم که موفق نبود
این کد تمام حالت های ممکن رو چک میکنه به همین دلیل بهینه نیست ولی فکر میکنم جواب درست تولید کنه

public $total = 1000;
public $coins = [100,300,500];
public $sum=[];
function rec($array,$total,$old){
    foreach ($array as $key=>$value){
        unset($array[$key]);
        for($i=floor($total/$value);$i>=0;$i--){
            $remain = $total-$i*$value;
            $old[$value]= $i;
            if ($remain==0){
                if (array_sum($old) >0){
                    $this->sum[implode(",",array_keys($old))."-".implode(",",array_values($old))] = $old;
                }
                $old =[];
            }
            elseif($remain<0){
                $old =[];
            }
                $this->rec($array,$remain,$old);
        }
    }
}

public function test()
{
    $this->rec($this->coins,$this->total,[]);
    echo json_encode($this->sum);
}

خروجی:

{
   "100-10":{
      "100":10
   },
   "100,300-7,1":{
      "100":7,
      "300":1
   },
   "100,300,500-5,0,1":{
      "100":5,
      "300":0,
      "500":1
   },
   "100,300-4,2":{
      "100":4,
      "300":2
   },
   "100,300,500-2,1,1":{
      "100":2,
      "300":1,
      "500":1
   },
   "100,300-1,3":{
      "100":1,
      "300":3
   },
   "100,300,500-0,0,2":{
      "100":0,
      "300":0,
      "500":2
   }
}

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام