[伯俊][三星基出]14501退社する
7764 ワード
質問する
コンサルタントの白俊さんが会社を辞めます.
今日からN+1日で辞めるために、残りのN日にできるだけ多くの相談をします.
白俊は秘書にできるだけ多くの相談を依頼し、秘書は1日に1回異なる人に相談を手配した.
各コンサルティングは,コンサルティングを完了するのに要する時間内にTIとコンサルティングを行う際に得られる金額Piからなる.
N=7の場合は、以下のコンサルティングスケジュールを参照してください.
1日のカウンセリングは全部で3日かかりますが、カウンセリング時にもらえる金額は10です.5日間のお問い合わせは2日間かかりますが、受け付けられる金額は15です.
相談にかかる時間は1日以上かかる場合がありますので、すべての相談はできません.例えば、1日に問い合わせを行った場合、2日、3日に問い合わせをすることはできません.2日に問い合わせをすれば、3、4、5、6日には問い合わせができない.
なお、N+1日は会社にいないため、6,7日は相談できません.
退職前にカウンセリングを行う最大の利益は1日、4日、5日にカウンセリングを行うことであり、その際の利益は10+20+15=45である.
商談がうまくいけば、白俊に最大の収益をもたらす計画を立ててください.
入力
第1行はN(1≦N≦15)を与える.
2行目からN行目まで、TIとPiはスペースで区切られ、1日からN日まで順次与えられる.(1 ≤ Ti ≤ 5, 1 ≤ Pi ≤ 1,000)
しゅつりょく
1行目は白俊が得られる最大の利益を出力する.
入力例
7
3 10
5 20
1 10
1 20
2 15
4 40
2 200
サンプル出力
45
に答える
/* Date: 2020-09-25 */
#include <iostream>
using namespace std;
typedef struct day{
int T;
int P;
} day;
day Day[16];
int N;
int Rst = 0;
void init();
void dfs(int curr, int cnt);
int main(){
init();
for(int i = 1; i <= N; i++){
dfs(i, Day[i].P);
}
cout << Rst << endl;
}
void init(){
cin >> N;
for(int i = 1; i <= N; i++){
cin >> Day[i].T >> Day[i].P;
}
}
void dfs(int curr, int cnt){
if(curr + Day[curr].T - 1 > N) return;
if(cnt > Rst) Rst = cnt;
for(int i = curr + Day[curr].T; i <= N; i++){
dfs(i, cnt + Day[i].P);
}
}
問題を読み始めたばかりの頃、チキン配達の問題を思い出した.M個の中から条件に合うN個を選べるようなのでDFSで解決しました.
試験例に合格するのに30分ぐらいかかりました.
しかし、提出後91%失敗した.
私はここでうろうろしていましたが、最終的にはRstの初期値が-1だったためです.
1
2 5
上記のテストケースを入力すると、利益は0元になります.比較演算を簡単に行うために便利な−1を初期値として例外があるとは思わなかった.
後で問題を解くときは、初期値を慎重に設定してください.
また、欲しい値が全く得られない場合は、default値がどれくらいあるべきかを考える習慣を身につけましょう.
Reference
この問題について([伯俊][三星基出]14501退社する), 我々は、より多くの情報をここで見つけました https://velog.io/@kyoung99u/백준-14501-퇴사テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol