제출 #628065

#제출 시각아이디문제언어결과실행 시간메모리
628065ducanhle_Knapsack (NOI18_knapsack)C++14
49 / 100
12 ms340 KiB
#include <bits/stdc++.h>
#define endl "\n"
#define ii pair<int,int>
#define nd second
#define st first

using namespace std;
const int MAXS = 2e3 + 5;
int n, dp[MAXS], s;
struct item{
    int v, w, k;
} items[105];
namespace SubTask{
    void solve(){
        for (int i = 1; i <= n; i++)
        {
            for (int w = s; w >= 0; w--)
            {
                for (int k = 1; k <= min(items[i].k, s / items[i].w); k++)
                {
                    if (w - k * items[i].w >= 0)
                        dp[w] = max(dp[w], dp[w - k * items[i].w] + k * items[i].v);
                }
            }
        }
        cout << *max_element(dp, dp + s + 1) << endl;
    }
}
namespace SubFull{
    const int MAXN = 1e5 + 5;
    map<int, vector<ii> > bw;
    void solve(){
        for (int i = 1; i <= n; i++){
            bw[items[i].w].push_back({items[i].v, items[i].k});
        }
        for (auto W : bw){
            auto [item_w, item] = W;
            sort(item.begin(), item.end(), greater<ii>());
            int cnt_item = 0;
            for (auto i : item) cnt_item += i.nd;
            for (int w = s; w >= 0; w--){
                int p = 0, cnt = 0, sum_value = 0;
                for (int k = 1; k <= min(cnt_item, s / item_w); k++){
                    cnt++;
                    if (cnt > item[p].nd){
                        p++;
                        cnt = 1;
                    }
                    sum_value += item[p].st;
                    if (w - k * item_w >= 0){
                        dp[w] = max(dp[w], dp[w - k * item_w] + sum_value);
                    }
                }
            }
        }
        cout << *max_element(dp, dp + s + 1);
    }
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> s >> n;
    for (int i = 1; i <= n; i++){
        cin >> items[i].v >> items[i].w >> items[i].k;
    }
    // if (n <= 100) SubTask::solve();
    // else 
    SubFull::solve();                          
}

컴파일 시 표준 에러 (stderr) 메시지

knapsack.cpp: In function 'void SubFull::solve()':
knapsack.cpp:37:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   37 |             auto [item_w, item] = W;
      |                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...