tutumlu bir bel çantası var. Dəyərləri və olan iki əşya mövcuddur. Onların hər birini bel çantasına istənilən sayda dəfə qoymaq olar. İki əşya üçün bel çantası məsələsini həll edirik.
Tutaq ki, əgər Bessi -ə bərabər toxluq əldə edə bilirsə, dp[i] = 1 olsun. İndi Bessi su içir. Belə ki, dp[i] = 1 olan hər qiyməti üçün dp[i / 2] = 1 təyin edirik.
İndi yenidən iki əşya üçün bel çantası məsələsini həll edirik. Bessinin su içdikdən sonra əldə edə biləcəyi toxluqları tapırıq.
Nümunə
Verilmiş nümunəyə baxaq. Portağallar və limonlar üçün bel çantası məsələsini həll edirik.
Bessi su içir.
Yenidən portağallar və limonlar üçün bel çantası məsələsini həll edirik.
Bessinin maksimum toxluğu -ə bərabərdir.
Alqoritmin realizasiyası
massivini elan edək, burada Bessi -ə bərabər toxluq əldə edə bilərsə, dp[i] = 1 olur.
#define MAX 5000001
int dp[MAX];Giriş məlumatlarını oxuyuruq.
scanf("%d %d %d", &t, &a, &b);Bel çantasını ilkinləşdiririk: heç nə yeməsə, toxluğuna nail olmaq mümkündür.
dp[0] = 1;Bel çantasına portağalları qoyuruq.
for (i = a; i <= t; i++)
if (dp[i - a] == 1) dp[i] = 1;Bel çantasına limonları qoyuruq.
for (i = b; i <= t; i++)
if (dp[i - b] == 1) dp[i] = 1;Bessi su içir. Əgər toxluğuna nail olunubsa, onda toxluğuna da nail olmaq mümkündür.
for (i = 1; i <= t; i++)
if (dp[i] == 1) dp[i / 2] = 1;Yenidən portağallar və limonlar üçün bel çantası məsələsini həll edirik.
for (i = a; i <= t; i++)
if (dp[i - a] == 1) dp[i] = 1;
for (i = b; i <= t; i++)
if (dp[i - b] == 1) dp[i] = 1;Bessinin əldə edə biləcəyi maksimum toxluğu tapır və çap edirik.
for (i = t; i > 0; i--)
if (dp[i] == 1) break;
printf("%d\n", i);Python realizasiyası
Giriş məlumatlarını oxuyuruq.
t, a, b = map(int, input().split())massivini elan edək, burada Bessi -ə bərabər toxluq əldə edə bilərsə, dp[i] = 1 olur.
dp = [0] * (t + 1)Bel çantasını ilkinləşdiririk: heç nə yeməsə, toxluğuna nail olmaq mümkündür.
dp[0] = 1Bel çantasına portağalları qoyuruq.
for i in range(a, t + 1):
if dp[i - a] == 1: dp[i] = 1Bel çantasına limonları qoyuruq.
for i in range(b, t + 1):
if dp[i - b] == 1: dp[i] = 1Bessi su içir. Əgər toxluğuna nail olunubsa, onda toxluğuna da nail olmaq mümkündür.
for i in range(1, t + 1):
if dp[i] == 1: dp[i // 2] = 1Yenidən portağallar və limonlar üçün bel çantası məsələsini həll edirik.
for i in range(a, t + 1):
if dp[i - a] == 1: dp[i] = 1
for i in range(b, t + 1):
if dp[i - b] == 1: dp[i] = 1Bessinin əldə edə biləcəyi maksimum toxluğu tapır və çap edirik.
for i in range(t, 0, -1):
if dp[i] == 1: break
print(i)