adlanan bir massiv təsvir edək, burada dəyəri 1 olacaq, əgər mövcud əşyalar ilə ümumi çəkisi olan yüki əldə etmək mümkündürsə. İbtidai şərt olaraq, mask[0] = 1 təyin edək.
Tutaq ki, massivi artıq müəyyən əşyalar dəsti üçün düzgün doldurulmuşdur. çəkili növbəti əşyanı nəzərdən keçirək. O zaman, mask[i - w] = 1 şərtinin ödəndiyi bütün i~(w \le i \le m) dəyərləri üçün mask[i] = 1 təyin etmək lazımdır.
Nümunə
Əşyaların işlənməsi zamanı massivinin hüceyrə dəyərlərinin necə dəyişəcəyini nəzərdən keçirək. Sol tərəfdə əşyaların çəkiləri göstərilir.
Maksimum çəki , alt cəm \{2, 1, 1\} olan dəstə üçün əldə edilir.
Alqoritmin həyata keçirilməsi
massivini bit maskası kimi saxlayırıq, başqa cür həll yaddaş məhdudiyyəti daxilində olmaz.
#define MAX 30000010
bitset\u003cMAX\u003e mask;Giriş məlumatlarını oxuyuruq. mask[0] = 1 təyin edirik.
scanf("%d %d",\u0026m,\u0026n);
mask.set(0);Növbəti çəkili əşyanın emalını nəzərdən keçirək. Məssivi sağdan sola keçir və mask[j - w] = 1 olan bütün j~(w \le j \le m) dəyərləri üçün mask[j] = 1 təyin edirik.
for (i = 0; i \u003c n; i++)
{
scanf("%d",\u0026w);
for (j = m; j \u003e\u003d w; j--)
if (mask[j - w] == 1) mask.set(j);
}Bütün əşyaların emalından sonra m-ə bərabər və ya m-dən böyük olmayan ən böyük çəki tapılır və çıxışa verilir.
for (i = m;; i--)
if (mask[i] \u003e 0) break;
printf("%d\n",i);