مشکل:سورس برنامه کوله پشتی

mhabat

Member
سلام سورس برنامه ی کوله پشتی رو دارم اما قابل فهم برام نیست.
سورس:
کد:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void sortbypw(int p[],int w[],int n)
{
 int i,t,j;
 for (i=0;i<=n-1;i++)
  for (j=i+1;j<=n;j++)
     if(((float)p[i]/w[i])<((float)p[j]/w[j]))
         {
     t=p[i];
     p[i]=p[j];
     p[j]=t;
     t=w[i];
     w[i]=w[j];
     w[j]=t;
    }
}

float knapsack(int p[],int w[],int n,int m)
{
sortbypw(p,w,n);
int w1=m;
int i=0;
float pp=0;
while (i<=n && w1>0)
 {
    if (w[i]<w1)
    {
     cout<<" p : "<<p[i];
     w1-=w[i];
     pp+=p[i];
     i++;
    }
    else
    {
     cout<<" p : "<<p[i];
     pp+=w1*((float)p[i]/w[i]);
    w1=0;
    }
 }
 return pp;
}

void main()
{
 int p[100]={6,12,7,18,9,30};
 int w[100]={1,5,3,9,5,20};
 clrscr();
 cout<<"If You Want Input Data Press (Y) Else Press (N) :";
 char ch=getche();
 if (ch=='n')
      cout<<"\n\n Arzesh Knapsack : "<<knapsack(p,w,5,20);
 else
     {
     int n,m;
     cout<<"\nEnter Weight Knapsack : ";
     cin>>m;
     cout<<"Enter Num : ";
     cin>>n;
     for (int i=0;i<n;i++)
     {
      cout<<"Enter Arzesh : ";
      cin>>p[i];
      cout<<"\nEnter Weight : ";
      cin>>w[i];
      gotoxy(20,wherey()-2);
      cout<<" P/W Is : "<<(float)p[i]/w[i];
      gotoxy(1,wherey()+2);
      cout<<".......................................\n";
     }
      cout<<"\n\n Arzesh Knapsack : "<<knapsack(p,w,n-1,m);
     }
 getch();
}
عذرمیخوام سورس برنامه زیاد هست.
خیلی ممنون
بـــدرود
 

the_king

مدیرکل انجمن
سلام سورس برنامه ی کوله پشتی رو دارم اما قابل فهم برام نیست.

اول به شما یک لیست از قیمت چند قلم کالا (p) و وزن شون (w) می دهند :
کد:
void main()
{
 int p[100]={6,12,7,18,9,30};
 int w[100]={1,5,3,9,5,20};

که می توانید با مقادیر جدیدی عوض اش هم بکنید :
کد:
 else
     {
     int n,m;
     cout<<"\nEnter Weight Knapsack : ";
     cin>>m;
     cout<<"Enter Num : ";
     cin>>n;
     for (int i=0;i<n;i++)
     {
      cout<<"Enter Arzesh : ";
      cin>>p[i];
      cout<<"\nEnter Weight : ";
      cin>>w[i];
      gotoxy(20,wherey()-2);
      cout<<" P/W Is : "<<(float)p[i]/w[i];
      gotoxy(1,wherey()+2);
      cout<<".......................................\n";
     }

مثلا از کالا شماره 2 [2]w گرم داریم و این کالا یکجا [2]p تومان می ارزه.
اما چون کالا ها خرده ریزه هستند و میشه یک تکه ازشون برداشت، لازم نیست که همه [w[2 رو یکجا بردارید.
محدودیت شما ظرفیت کوله پشتی تونه که بیشتر از m گرم نمی تونه حمل کنه و بیشتر از اون باشه پاره میشه.
حالا شما اول از کدوم جنس ها بر می دارید؟ از اونهایی که ارزش شون بیشتره یعنی هر گرم شون بیشتر می ارزه.
پس اول کالا ها رو بر اساس نسبت قیمت به وزن شون بصورت نزولی مرتب می کنید تا اونی که بیشتر می ارزه اول آرایه
قرار بگیره :
کد:
void sortbypw(int p[],int w[],int n)
{
 int i,t,j;
 for (i=0;i<=n-1;i++)
  for (j=i+1;j<=n;j++)
[B][COLOR="Blue"]     if(((float)p[i]/w[i])<((float)p[j]/w[j]))[/COLOR][/B]
         {
     t=p[i];
     p[i]=p[j];
     p[j]=t;
     t=w[i];
     w[i]=w[j];
     w[j]=t;
    }
}
اگر ارزش کالا فلان از کالا بهمان کمتر بود، جایشان در آرایه ها عوض میشه، هم قیمت و هم وزن.

نحوه برداشتن از کالا ها در کوله پشتی هم ساده است، اگر وزن کل اون جنس کمتر از جای خالی کوله پشتی بود،
همه شو بر می داریم :
کد:
float knapsack(int p[],int w[],int n,int m)
{
sortbypw(p,w,n);
int w1=m;
int i=0;
float pp=0;
while (i<=n && w1>0)
 {
[B][COLOR="Blue"]    if (w[i]<w1)
[/COLOR][/B]    {
     cout<<" p : "<<p[i];
     w1-=w[i];
     pp+=p[i];
     i++;
    }
    else

وگرنه فقط اونقدر که جا توی کوله پشتی مونده بر می داریم :
کد:
    else
    {
     cout<<" p : "<<p[i];
     pp+=w1*((float)p[i]/w[i]);
    w1=0;
    }
طبیعتا اگر جای خالی نمونده باشه 0 گرم بر می داریم.

pp مجموع ارزش کالا هایی است که ریختیم توی کوله پشتی :
کد:
 return pp;
 

mhabat

Member
با تشکر فراوان از the_kingعزیز.
این قمست رو متوجه نمیشم:
کد:
gotoxy(20,wherey()-2);
      cout<<" P/W Is : "<<(float)p[i]/w[i];
      gotoxy(1,wherey()+2);
از فایل سرآمدstdioبرایgotoxyاستفاده میشه؟در چه قسمتی کاربرد داره؟
همچنین floatاین قسمت رو متوجه نمشم:
کد:
[B][COLOR=#0000ff]if(((float)p[i]/w[i])<((float)p[j]/w[j]))[/COLOR][/B]
چرا floatرو داخل پرانتز قرارداده؟
خیلی ممنون
بــدرود
 

the_king

مدیرکل انجمن
با تشکر فراوان از the_kingعزیز.
این قمست رو متوجه نمیشم:
کد:
gotoxy(20,wherey()-2);
      cout<<" P/W Is : "<<(float)p[i]/w[i];
      gotoxy(1,wherey()+2);
از فایل سرآمدstdioبرایgotoxyاستفاده میشه؟در چه قسمتی کاربرد داره؟

gotoxy در conio تعریف شده، نه stdio . جزو کتابخانه هایی است که معمولا در کد قرارش می دهند، حالا چه
استفاده بشه و چه نشه، توابع دسترسی به فایل و ورودی و خروجی های استاندارد زبان C در stdio تعریف شده اند.
gotoxy دستور استانداردی نیست، اغلب کامپایلر ها پشتیبانی اش نمی کنند، استفاده نشه بهتره.
کل اون کد صرفا برای نمایش اعشاری کسر [p / w[i است.

همچنین floatاین قسمت رو متوجه نمشم:
کد:
[B][COLOR=#0000ff]if(((float)p[i]/w[i])<((float)p[j]/w[j]))[/COLOR][/B]

چرا floatرو داخل پرانتز قرارداده؟
خیلی ممنون
بــدرود
متغیر های [p[i و [w[i هر دو از نوع داده int یعنی صحیح بدون اعشار هستند، اگر با عملگر / تقسیم شان کنید
کامپایلر از تقسیم اعداد صحیح استفاده می کند و بخش اعشاری تقسیم را حذف می کند، مثلا 5 / 9 را بجای
1.8 برابر 1 در نظر می گیرد. برای اینکه تقسیم اعشار را در نظر بگیرد باید محاسبه اعشاری مثل float
بکار گرفته شود. وقتی قبل از یک مقدار (float) را اضافه می کنید، کامپایلر مقدار مورد نظر را به نوع داده ای float
تبدیل می کند. در نتیجه کامپایلر بجای تقسیم صحیح بدون اعشار از تقسیم اعشاری استفاده می کند.
به این کار می گویند type casting ، هر جا که نوع داده مقداری باید صریحا عوض شود نوع داده را داخل پارانتز
می نویسیم.
 

جدیدترین ارسال ها

بالا