저는 가치 / 평균 값 구한다음
가성비 좋은 순으로 나열하고
그다음 위에서 부터 넣었는데
그러면 최대 무게로 우겨넣는걸 못함
-설명-
물건 3개 총무게 5
가치 1 무게 1
가치 3 무게 3
가치 4 무게 4
이렇게 나오면
위에서 1,2번 넣고 끝남
근데 1,3번 넣는게 총 가치가 더 높잖아
이부분을 어떻게 해야할지 모르겠음
예시를 들자면 이런 상황임
1번은 평균가치가 높아서 제일 먼저 들어가지만
총 무게가 10이나 남는 상황
1번(04,05)을 빼고 4번(08,14)를 넣어도되는 상황인데
어케하면 좋을까?
이런거 태어나서 처음해봐서 어렵넹..
첨부파일로 C# 짜놓은거 텍스트파일로올렸음 (안올라가네??)
걍 복붙함
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Bagging
{
static void Main(string[] args)
{
List<int> W = new List<int>();
List<int> V = new List<int>();
List <float> VW = new List<float>();
Random rand = new Random();
int N = rand.Next(1, 101);
int K = rand.Next(1, 1001);
int Total_V = 0;
int Total_W = 0;
Console.WriteLine("개수" + N + " | 총무게" + K + " |\n");
for (int i = 0; i < N; i++)
{
W.Add(rand.Next(1, 100001));
V.Add(rand.Next(1, 1001));
VW.Add(((float)V[i] / W[i]));
Console.WriteLine("가치" + V[i].ToString("D2") + " |무게" + W[i].ToString("D2") + " |평균" + VW[i].ToString("N3"));
}
int tempV = 0;
int tempW = 0;
float tempVW = 0;
int t = 0;
Console.WriteLine("\n변경후------------------\n");
for (int i = 0; i < N; i++)
{
tempV = V[i];
tempW = W[i];
tempVW = VW[i];
t = i;
for (int k = i; k < N; k++)
{
if(VW[k] > tempVW)
{
tempVW = VW[k];
tempV = V[k];
tempW = W[k];
t = k;
}
}
VW[t] = VW[i];
V[t] = V[i];
W[t] = W[i];
VW[i] = tempVW;
V[i] = tempV;
W[i] = tempW;
}
for (int i = 0; i < N; i++)
{
Console.WriteLine("가치" + V[i].ToString("D2") + " |무게" + W[i].ToString("D2") + " |평균" + VW[i].ToString("N3"));
}
for (int i = 0; i < N; i++)
{
if (Total_W + W[i] > K)
{
}
else
{
Total_V += V[i];
Total_W += W[i];
}
}
Console.WriteLine("\n총 가치 = " + Total_V + "| 총 무게 = " + Total_W + "\n");
}
}
배낭 알고리즘 검색 해 보는게 나을 듯
프로그래밍 갤러리 같은데 가면 좋다고 풀어주지 않을까? 이런거 옛날에 해봤는데 안써서 다까먹었네
함수를 만들어서 일정 무게를 주면 그 무게 내의 가장 큰 가치의 물건을 선택하는 함수를 짠뒤(위에 짠거처럼), 만약 무게의 합이 꽉 차지 않고 남는다면 가장 큰 물건을 빼고 리스트에서도 뺸뒤 다시 그 함수를 호출하는거야. 그리고 그렇게 구한 합을 계산해서 원래 값보다 크면 새롭게 갱신하고 작으면 그냥 원래거 쓰는 식으로 재귀함수 만들면 될듯한데 말도 복잡한데 구현하는건 더 복잡할듯.
dp로 풀면 타임아웃 안남
http://boj.kr/71383fc40dfd4885aa69f2386365ad3e
내가 예전에 풀었던 코드고 이런 얘기 하는 PS 갤러리라고 따로 있음 이런건 기법을 먼저 알아두고 풀어야 함
이건 DP(다이나믹 프로그래밍, 동적 계획법) 기본 문제니까 관련 기법(메모이제이션)만 알면 쉽게 풀 수 있음 ㅇㅇ
C++문법을 몰라서 봐도 뭔소린지 모르겠ㄷ...
윗댓글 보고 배낭알고리즘 검색해봤는 dp가 뭔지 잘이해가 안가네 플밍갤가서 함물어봐야겠다
PS갤러리 가라고
저런거 풀거면 C#보다 C++이나 python 알아놓는게 편함
std::cin은 입력, std::cout은 출력 함수란 것만 빼면 C#이랑 별로 다를거 없어서 그렇게 읽으면 편할듯?