グレースケールアルゴリズム
グリディアルゴリズム、貪欲アルゴリズムは最適解を求める方法である.
問題の最適化に使用する最大または最小の解を探します.
多くの場合、どちらかを選ぶたびに、その瞬間に自分が一番適当だと思っているものを選び、外に出るようにして答えを出す.
各選択点の決定は地域的に最良であるが、これらの選択を収集し続け、最終的に答えを出すと、それが最良であることは保証されない.
一度選ばれたら、後悔しない.そのため、大部分
代表的な質問でお金を探します.
おつりの問題で解決しましょう.
他のブログで大発の簡単なコードを見つけて共有します.
https://foxtrotin.tistory.com/319
このコードは
nを5で割った残数は0,1,2,3,4である
残りが2,4なら、探した5の残りを全部2にするので、n%5/2を加えればいいです.
n=9の場合
例えば、n=13は5元1個、2元4個、5個が答えである.
これは何度も聞いたことのある質問です.泥棒は盗んだものをリュックサックに入れようとしたが、リュックサックの重さは限られており、物の重さと価値は固定されている.このとき盗んだ品物の価格が最大の問題です.
(仮に1つのものしかないとします)
Knapsackには2つのタイプがあり、最適な貪欲法を求めるにはFractionalリュックサックしか使えません.0-1リュックサックはdpで解くことができます. 0-1 Knapsack 物が割れない Fracktional Knapsack
*分割できるものは/457916、
Fractionalリュックサックの時は簡単に考えて、リュックサックにもっと高いものを入れればいいです.
それなら1キロ当たりの価格でリュックの重さを計算すればいいです.リュック30キロの時
モノ1(50)+モノ3(140)+モノ2の半分(30)=220万円が正解
問題の最適化に使用する最大または最小の解を探します.
多くの場合、どちらかを選ぶたびに、その瞬間に自分が一番適当だと思っているものを選び、外に出るようにして答えを出す.
各選択点の決定は地域的に最良であるが、これらの選択を収集し続け、最終的に答えを出すと、それが最良であることは保証されない.
一度選ばれたら、後悔しない.そのため、大部分
탐욕 알고리즘들은 단순하며, 또한 제한적인 문제들에 적용된다.
金をさがす
代表的な質問でお金を探します.
물건값: 1200원
받은돈: 2000원
거스름돈: 800원
이 때 거스름돈으로 주는 최적해는 500원 1개, 100원 3개이다
https://www.acmicpc.net/problem/14916 おつりの問題で解決しましょう.
public class boj_14916 {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int cnt = 0;
boolean isAns = false;
while(n >= 0){
// 5로 나누어 떨어지면 바로 답 출력
if(n % 5 == 0){
System.out.println(cnt + n/5);
isAns = true;
break;
}
// 안되면 2씩 뺀다
n -= 2;
cnt++;
}
if(!isAns){
System.out.println(-1);
}
}
}
2を減算し続け、5を減算すると、答えが出力されます.反復文条件はn>0ではなく、n>=0の原因はお金を探すためであり、nが0になるとif(n%5=0)条件に遭遇する.繰り返し文では,nが0でなければ5と2を組み合わせることができないため,isAnsを用いて不可能な場合に−1を出力する.他のブログで大発の簡単なコードを見つけて共有します.
https://foxtrotin.tistory.com/319
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int cnt = 0;
if(n == 1 || n == 3){
System.out.println(-1);
return;
}
if(n % 5 % 2 == 0){
cnt = n / 5 + n % 5 / 2;
}else{
cnt = n / 5 + (n%5 + 5)/2 - 1
}
System.out.println(cnt);
}
5と2を分けたら、あと5元で有利なので、先に分けて、残りのお金は2を探します.このコードは
cnt = n/5 + n%5/2
nは6,13のようにお互いを区別せず、これを理解するのは難しい.nを5で割った残数は0,1,2,3,4である
残りが2,4なら、探した5の残りを全部2にするので、n%5/2を加えればいいです.
n=9の場合
(거스름돈/5) + (거스름돈%5/2) = 1+2 = 3
残りが1、3なら2に分けられないので、5円玉を1つ少なくして6、8にして2に分けます.例えば、n=13は5元1個、2元4個、5個が答えである.
(거스름돈/5 - 1) + (거스름돈%5 + 5)/2 - 1= 1+4-1 = 4
リュックサックの梱包(Knapsack)
これは何度も聞いたことのある質問です.泥棒は盗んだものをリュックサックに入れようとしたが、リュックサックの重さは限られており、物の重さと価値は固定されている.このとき盗んだ品物の価格が最大の問題です.
배낭 무게: 30kg
물건1: 25kg, 10원
물건2: 10kg, 9원
물건3: 10kg, 5원
答え:東西2+物件3=9元+5元=14元が答えです.(仮に1つのものしかないとします)
Knapsackには2つのタイプがあり、最適な貪欲法を求めるにはFractionalリュックサックしか使えません.0-1リュックサックはdpで解くことができます.
*分割できるものは/457916、
Fractionalリュックサックの時は簡単に考えて、リュックサックにもっと高いものを入れればいいです.
それなら1キロ当たりの価格でリュックの重さを計算すればいいです.リュック30キロの時
モノ1(50)+モノ3(140)+モノ2の半分(30)=220万円が正解
Reference
この問題について(グレースケールアルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@choieunsong/그리디-알고리즘-mfp43dudテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol