結果
問題 | No.1858 Gorgeous Knapsack |
ユーザー |
![]() |
提出日時 | 2022-05-07 16:46:20 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 97 ms / 2,000 ms |
コード長 | 2,691 bytes |
コンパイル時間 | 939 ms |
コンパイル使用メモリ | 93,372 KB |
実行使用メモリ | 199,168 KB |
最終ジャッジ日時 | 2024-07-06 22:05:13 |
合計ジャッジ時間 | 3,125 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 37 |
ソースコード
//// Yukicoder// No.1858////#include "stdafx.h"#include <stdio.h>#include <iostream>#include <vector>#include <list>//list#include <set> //tree#include <map> //連想配列#include <unordered_set> //hash#include <unordered_map> //hash#include <algorithm>#include <iomanip>#include <string>#include <stdlib.h>using namespace std;typedef unsigned long long ULL;typedef signed long long SLL;typedef unsigned int UINT;#define START (0)#define RIGHT (1)#define UP (2)#define LEFT (3)#define DOWN (4)#define DATA_MAX (1000000)#define FMAX(a,b) ((a)>(b)?(a):(b))#define FMIN(a,b) ((a)<(b)?(a):(b))//vectorは便利だが処理時間がかかるので注意vector <vector <SLL>> memo2;//二次元可変配列vector<SLL> memo1;SLL H ,A, B, T, F, N, M, Result;SLL backet[1000005];SLL dp[5005][5005];struct BOX {SLL w;SLL v;};BOX box[5005];//美しさの降順にソートint compare(const BOX * a, const BOX *b){if (a->v < b->v)return (1);else if (a->v > b->v)return (-1);return (0);}int main(int argc, char *argv[]){ULL ans = 0;// 入力部cin >> N;cin >> M;for (int i = 0; i < N; i++){cin >> box[i].v;cin >> box[i].w;}//Sortingqsort(&box[0], N, sizeof(BOX), (int(*)(const void*,const void*))compare);//ソート結果のデバッグ出力/*for (int i = 0; i < N; i++){cout << "V=" << box[i].v << ",W=" << box[i].w << endl;}*///最初の1行目(i=0)for (int j = 0; j <= M; j++){if (j >= box[0].w){dp[0][j] = box[0].v;ans = FMAX(ans, box[0].v * dp[0][j]);}}//美しさの降順になっているため、i番目以下で最も美しさの小さいものはi番目であるfor(int i=1;i<N;i++)for (int j = 0; j <= M; j++)//ナップサックの容量を1つづつ増やしていく{if (j >= box[i].w){// "j" の容量のときに、下記AとBを比較する// A: 今回の宝石を入れた場合の価値 → dp[i - 1][j - box[i].w] + box[i].v// B: 今回の宝石を入れなかった場合の価値 → dp[i - 1][j]if (dp[i - 1][j - box[i].w] + box[i].v > dp[i - 1][j]){dp[i][j] = dp[i - 1][j - box[i].w] + box[i].v;ans = FMAX(ans, box[i].v * dp[i][j]);}else{dp[i][j] = dp[i - 1][j];}}else{dp[i][j] = dp[i - 1][j];}}cout << ans << endl;/*for (int i = 0; i < N; i++){for (int j = 0; j <= M; j++)//ナップサックの容量を1つづつ増やしていく{cout << dp[i][j] << ",";}cout << endl;}*//////////////////////cout << endl;getchar();return 0; //end}