<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2413_-_reteta1</id>
	<title>2413 - reteta1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2413_-_reteta1"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2413_-_reteta1&amp;action=history"/>
	<updated>2026-05-02T19:34:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2413_-_reteta1&amp;diff=10060&amp;oldid=prev</id>
		<title>Benzar Ioan: Pagină nouă: == Cerința == Gigel trebuie să cumpere n medicamente, numerotate de la 1 la n. Doctorul i-a dat m rețete de două tipuri, codificate cu numerele 1, 2 astfel: 1 – reţetă necompensată, adică preţul medicamentelor de pe reţetă se achită integral de către cumpărător; 2 – reţetă compensată 50%, adică prețul medicamentelor înscrise pe rețetă se înjumătățește. Se ştie că pe reţete nu există un alt medicament decât cele numeroatete de la 1 la n şi...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2413_-_reteta1&amp;diff=10060&amp;oldid=prev"/>
		<updated>2024-06-03T18:44:18Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Cerința == Gigel trebuie să cumpere n medicamente, numerotate de la 1 la n. Doctorul i-a dat m rețete de două tipuri, codificate cu numerele 1, 2 astfel: 1 – reţetă necompensată, adică preţul medicamentelor de pe reţetă se achită integral de către cumpărător; 2 – reţetă compensată 50%, adică prețul medicamentelor înscrise pe rețetă se înjumătățește. Se ştie că pe reţete nu există un alt medicament decât cele numeroatete de la 1 la n şi...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Cerința ==&lt;br /&gt;
Gigel trebuie să cumpere n medicamente, numerotate de la 1 la n. Doctorul i-a dat m rețete de două tipuri, codificate cu numerele 1, 2 astfel:&lt;br /&gt;
1 – reţetă necompensată, adică preţul medicamentelor de pe reţetă se achită integral de către cumpărător;&lt;br /&gt;
2 – reţetă compensată 50%, adică prețul medicamentelor înscrise pe rețetă se înjumătățește.&lt;br /&gt;
Se ştie că pe reţete nu există un alt medicament decât cele numeroatete de la 1 la n şi o reţetă nu conţine două medicamente identice.&lt;br /&gt;
Dacă o reţetă este folosită atunci se vor cumpăra toate medicamentele înscrise pe ea.&lt;br /&gt;
Scrieţi un program care să determine suma minimă de bani necesară pentru a cumpăra exact câte unul din fiecare dintre cele n medicamente, folosindu-se de reţetele avute la dispoziţie.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare reteta1.in are următorul format:&lt;br /&gt;
- pe prima linie sunt scrise numerele naturale n şi m;&lt;br /&gt;
- pe următoarele m linii sunt descrise cele m reţete, câte o reţetă pe o linie. Linia care descrie o reţetă conţine tipul reţetei (1 necompensată sau 2 compensată), urmat de un număr natural q reprezentând numărul de medicamente de pe reţetă, apoi de q numere distincte din mulţimea {1, 2, ..., n} reprezentând medicamentele înscrise pe acea reţetă;&lt;br /&gt;
- pe ultima linie a fişierului de intrare sunt scrise n numere naturale separate prin câte un spaţiu, reprezentând în ordinea de la 1 la n, preţul medicamentelor.&lt;br /&gt;
Toate numerele de pe aceeaşi linie sunt separate prin câte un spaţiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire reteta1.out va conţine o singură linie pe care va fi scris un număr real cu o singură zecimală, reprezentând suma minimă determinată.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
*1 ≤ N ≤ 20&lt;br /&gt;
*1 ≤ M ≤ 15&lt;br /&gt;
*1 ≤ preţul oricărui medicament ≤ 200&lt;br /&gt;
*Pentru datele de test există întotdeauna soluţie.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
;Intrare&lt;br /&gt;
4 5&amp;lt;br&amp;gt;&lt;br /&gt;
2 1 3&amp;lt;br&amp;gt;&lt;br /&gt;
2 2 2 3&amp;lt;br&amp;gt;&lt;br /&gt;
1 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
1 3 4 1 2&amp;lt;br&amp;gt;&lt;br /&gt;
1 1 3&amp;lt;br&amp;gt;&lt;br /&gt;
8 20 2 16&lt;br /&gt;
;Iesire&lt;br /&gt;
45.0&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &amp;#039;r&amp;#039;) as file:&lt;br /&gt;
        lines = file.readlines()&lt;br /&gt;
        n, m = map(int, lines[0].strip().split())&lt;br /&gt;
        retete = []&lt;br /&gt;
        for i in range(1, m + 1):&lt;br /&gt;
            parts = list(map(int, lines[i].strip().split()))&lt;br /&gt;
            tip = parts[0]&lt;br /&gt;
            medicamente = parts[1:]&lt;br /&gt;
            retete.append((tip, medicamente))&lt;br /&gt;
        preturi = list(map(int, lines[m + 1].strip().split()))&lt;br /&gt;
    return n, m, retete, preturi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, result):&lt;br /&gt;
    with open(filename, &amp;#039;w&amp;#039;) as file:&lt;br /&gt;
        file.write(f&amp;quot;{result:.1f}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_min_cost(n, m, retete, preturi):&lt;br /&gt;
    INF = float(&amp;#039;inf&amp;#039;)&lt;br /&gt;
    dp = [INF] * (1 &amp;lt;&amp;lt; n)&lt;br /&gt;
    dp[0] = 0&lt;br /&gt;
&lt;br /&gt;
    for tip, medicamente in retete:&lt;br /&gt;
        mask = 0&lt;br /&gt;
        cost = 0&lt;br /&gt;
        for medicament in medicamente:&lt;br /&gt;
            mask |= 1 &amp;lt;&amp;lt; (medicament - 1)&lt;br /&gt;
            if tip == 1:&lt;br /&gt;
                cost += preturi[medicament - 1]&lt;br /&gt;
            else:&lt;br /&gt;
                cost += preturi[medicament - 1] / 2&lt;br /&gt;
&lt;br /&gt;
        for i in range((1 &amp;lt;&amp;lt; n) - 1, -1, -1):&lt;br /&gt;
            dp[i | mask] = min(dp[i | mask], dp[i] + cost)&lt;br /&gt;
&lt;br /&gt;
    return dp[(1 &amp;lt;&amp;lt; n) - 1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    input_file = &amp;#039;reteta1.in&amp;#039;&lt;br /&gt;
    output_file = &amp;#039;reteta1.out&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    n, m, retete, preturi = read_input(input_file)&lt;br /&gt;
&lt;br /&gt;
    # Validări&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20):&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie între 1 și 20.&amp;quot;)&lt;br /&gt;
    if not (1 &amp;lt;= m &amp;lt;= 15):&lt;br /&gt;
        raise ValueError(&amp;quot;m trebuie să fie între 1 și 15.&amp;quot;)&lt;br /&gt;
    if any(p &amp;lt; 1 or p &amp;gt; 200 for p in preturi):&lt;br /&gt;
        raise ValueError(&amp;quot;Prețurile trebuie să fie între 1 și 200.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    min_cost = calculate_min_cost(n, m, retete, preturi)&lt;br /&gt;
    write_output(output_file, min_cost-1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benzar Ioan</name></author>
	</entry>
</feed>