๐Ÿ’ป

[๋ฐฑ์ค€] ๊ทธ๋ฆฌ๋””์•Œ๊ณ ๋ฆฌ์ฆ˜ - 12866. ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ œํ’€์ด Baekjoon

[๋ฐฑ์ค€] ๊ทธ๋ฆฌ๋””์•Œ๊ณ ๋ฆฌ์ฆ˜ - 12866. ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ

๋˜ํšจ๋‹ˆ 2020. 2. 27. 21:51

๋ฌธ์ œ

์ด ๋ฌธ์ œ๋Š” ์•„์ฃผ ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ์— ๊ด€ํ•œ ๋ฌธ์ œ์ด๋‹ค.

ํ•œ ๋‹ฌ ํ›„๋ฉด ๊ตญ๊ฐ€์˜ ๋ถ€๋ฆ„์„ ๋ฐ›๊ฒŒ ๋˜๋Š” ์ค€์„œ๋Š” ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์„ธ์ƒ๊ณผ์˜ ๋‹จ์ ˆ์„ ์Šฌํผํ•˜๋ฉฐ ์ตœ๋Œ€ํ•œ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•œ ์—ฌํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์ง€๊ณ  ๋‹ค๋‹ ๋ฐฐ๋‚ญ ๋˜ํ•œ ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜ ์žˆ๊ฒŒ ์‹ธ๋ ค๊ณ  ํ•œ๋‹ค.

์ค€์„œ๊ฐ€ ์—ฌํ–‰์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” N๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค. ๊ฐ ๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ W์™€ ๊ฐ€์น˜ V๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์–ด์„œ ๊ฐ€๋ฉด ์ค€์„œ๊ฐ€ V๋งŒํผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์•„์ง ํ–‰๊ตฐ์„ ํ•ด๋ณธ ์ ์ด ์—†๋Š” ์ค€์„œ๋Š” ์ตœ๋Œ€ K๋ฌด๊ฒŒ๊นŒ์ง€์˜ ๋ฐฐ๋‚ญ๋งŒ ๋“ค๊ณ  ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค. ์ค€์„œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ฆ๊ฑฐ์šด ์—ฌํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์•Œ๋ ค์ฃผ์ž.

 

์ž…๋ ฅ

์ฒซ ์ค„์— ๋ฌผํ’ˆ์˜ ์ˆ˜ N(1 ≤ N ≤ 100)๊ณผ ์ค€์„œ๊ฐ€ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ K(1 ≤ K ≤ 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ W(1 ≤ W ≤ 100,000)์™€ ํ•ด๋‹น ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜ V(0 ≤ V ≤ 1,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” ์ •์ˆ˜์ด๋‹ค.

 

์ถœ๋ ฅ

ํ•œ ์ค„์— ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ1

4 7
6 13
4 8
3 6
5 12

 

์˜ˆ์ œ ์ถœ๋ ฅ1

14

 

์ƒ๊ฐ

์ผ๋ฐ˜์ ์ธ ๋ฐฐ๋‚ญ๋ฌธ์ œ์˜€๋‹ค. ์˜ค๋žœ๋งŒ์— ํ’€์–ด์„œ ๊ธฐ์–ต์ด ์•ˆ๋‚˜์„œ knapsack ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฐธ๊ณ ํ–ˆ๋‹ค. 

 

์ž‘์„ฑํ•œ ์ฝ”๋“œ

#include <iostream>
#include <vector>
using namespace std;

int ans[100][100001];
vector<pair<int,int> > profit;
int n, w, v, k;
int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> n >> k; // n:๋ฌผํ’ˆ์˜ ์ˆ˜, k:๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ
    
    for(int i=0; i<n; i++){
        cin >> w >> v;
        profit.push_back(make_pair(w,v));
    }
    
    for(int i=0; i<n; i++){
        for(int j=0; j<=k; j++){
            // ์ฒ˜์Œ์ด๊ณ , ๋ฌด๊ฒŒ๊ฐ€ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฉด ๋„ฃ๋Š”๋‹ค.
            if(i==0){
                if(profit[i].first <= j){
                    ans[i][j] = profit[i].second;
                }
                continue;
            }
            //๋„ฃ์œผ๋ ค๋Š” ๋ฌผ๊ฑด์ด ๋ฌด๊ฒŒ์กฐ๊ฑด์„ ์ถฉ์กฑํ–ˆ์„ ๋•Œ๋Š” ์ด์ „๋ฌผ๊ฑด์˜ ๊ฐ€์น˜์™€ ์ด์ „๋ฌผ๊ฑด์— ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋„ฃ์—ˆ์„๋•Œ์˜ ๊ฐ€์น˜ ์ค‘์— ํฐ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
            if(profit[i].first <= j){
                ans[i][j] = max(ans[i-1][j], ans[i-1][j-profit[i].first] + profit[i].second);
            }else{ // ๋ฌด๊ฒŒ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ด์ „ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜๋กœ ํ•œ๋‹ค.
                ans[i][j] = ans[i-1][j];
            }
        }
    }
    cout << ans[n-1][k] << "\n";
}

+ ๋‹ค๋ฅธ ํ’€์ด)

#include <iostream>
#include <algorithm>
using namespace std;
 int d[101][100001];
 int w[101],v[101];

int main() {
     int n,k,i,j;
     cin >> n >> k;
     for(int i=1; i<=n; i++)
	        cin>>w[i]>>v[i];
     for(i=1; i<=n; i++){
          for(j=1; j<=k; j++){
                if(w[i]>j){
                    d[i][j] = d[i-1][j];
                }else{
                    d[i][j]=max(d[i-1][j],d[i-1][j-w[i]]+v[i]);
                }
           }
      } 
      cout << d[n][k];
      return 0;
}
๋ฐ˜์‘ํ˜•
Comments