304102026-07-05 16:55:24KristófVásárlásokcpp17Hibás válasz 16/10010ms1224 KiB
#include <iostream>
#include <vector>
using namespace std;
int INF=1e9;
int main()
{
    int k,n;cin>>k>>n;
    vector<vector<int>> costs(n+1,vector<int>(k));
    for(int i=0;i<k;i++)
        for(int j=0;j<n;j++)cin>>costs[j][i];
    vector<vector<int>> dp(n+1,vector<int>(1<<k,1e9));
    dp[0][0]=0;
    vector<vector<int>> choice(n+1,vector<int>(1<<k,-1));//-1 = nem csinalsz semmit , ezelotti napra mesz ugyanazzal a bitmaskkal
    for(int i=0;i<n;i++)
        {
        for(int mask=0;mask<(1<<k);mask++)
            {
            if(i+1!=n)
                dp[i+1][mask]=min(dp[i+1][mask],dp[i][mask]);
            for(int bit=0;bit<k;bit++)
                {
                if(mask & (1<<bit))continue;
                int nmask=mask|(1<<bit);
                if(dp[i+1][nmask]>dp[i][mask]+costs[i][bit])
                    {
                    choice[i+1][nmask]=mask;
                    }
                dp[i+1][nmask]=min(dp[i+1][nmask],dp[i][mask]+costs[i][bit]);
                }
            }
        }
    int bitmask=(1<<k)-1;
    cout<<dp[n][(1<<k)-1]<<"\n";
    vector<int> ans(k);
    int day=n;
    while(day>0)
        {
        for(int bit=0;bit<k;bit++)
            {
            if(bitmask&(1<<bit))
                {
                int prevmask=bitmask^(1<<bit);
                if(dp[day][bitmask]==dp[day-1][prevmask]+costs[day-1][bit])
                    {
                    ans[bit]=day;
                    bitmask=prevmask;
                    break;
                    }
                }
            }
        day--;
        }
    for(int x:ans)cout<<x<<" ";
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base16/100
1Elfogadva8/81ms316 KiB
2Elfogadva8/81ms508 KiB
3Hibás válasz0/81ms316 KiB
4Hibás válasz0/101ms316 KiB
5Hibás válasz0/101ms356 KiB
6Hibás válasz0/101ms316 KiB
7Hibás válasz0/102ms316 KiB
8Hibás válasz0/123ms564 KiB
9Hibás válasz0/126ms820 KiB
10Hibás válasz0/1210ms1224 KiB