白駿[2293]硬貨1 C++解答
2288 ワード
白駿[2293]硬貨1
アイデア[DP]は を操作する.
方法硬貨の値をベクトル に記憶する. DPを使用していますが、1枚の硬貨を使用するごとに段階的な調査が行われています. 点火式は「現在計算されている偽数=以前の硬貨でしか計算できない数字+新たに入れる硬貨を含む偽数」で、 .
DP冗長性を解消する方法を尋ねる.
重複を解決する方法を見つけるのは難しいと思います.DP問題をよく解決している人なら、完全に解決できる問題だと思います.学習要点:DPの点火式 を確立する
アイデア
方法
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <math.h>
#include <queue>
#define MAX 987654321
using namespace std;
//(coin 번호, 총합 금액)
int arr[100001];
int main()
{
int coin_cnt, target_won; scanf("%d %d", &coin_cnt, &target_won);
vector<int> coins;
for (int i = 0; i < coin_cnt; i++)
{
int num; scanf("%d", &num);
coins.push_back(num);
}
//하나씩 동전을 추가할때마다 나오는 경우를 dp로 점점 저장해준다
for (int now = 0; now < coins.size(); now++)
{
//지금부터 계산하려는 동전의 값에 경우의 수 1을 넣는다
int coin = coins[now];
arr[coin] += 1;
// 이번에 새로 동전을 넣은 경우의수 + 이전 동전으로만 가능한 경우의 수
for (int now_won = 1; now_won <= target_won; now_won++)
{
if (now_won - coin >= 0) arr[now_won] += arr[now_won - coin];
}
}
printf("%d\n", arr[target_won]);
return 0;
}
評価DP冗長性を解消する方法を尋ねる.
重複を解決する方法を見つけるのは難しいと思います.DP問題をよく解決している人なら、完全に解決できる問題だと思います.
Reference
この問題について(白駿[2293]硬貨1 C++解答), 我々は、より多くの情報をここで見つけました https://velog.io/@nacean/백준2293-동전-1-C-풀이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol