소감 ¶
2005-12-27  Accepted  2.184  528 
동적프로그래밍 문제. n! 번의 수행을 해야하는 문제가 동적프로그래밍을 이용하니 O(n^2)만에 풀 수 있다. 동적프로그래밍의 힘이 대단하다.
동적프로그래밍 문제. n! 번의 수행을 해야하는 문제가 동적프로그래밍을 이용하니 O(n^2)만에 풀 수 있다. 동적프로그래밍의 힘이 대단하다.
코드 ¶
~cpp
// 10154 - Weights and Measures
#include <iostream>
#include <algorithm>
using namespace std;
//#include <fstream>
//fstream fin("in.txt");
#define MAX_SIZE 5608
#define MAX_WEIGHT 10000000
typedef struct
{
	int weight;
	int strength;
}Turtle;
inline
bool turtleGreater(const Turtle& A, const Turtle& B)
{
	return A.strength < B.strength;
}
void input(Turtle* t, int* numT)
{
	*numT = 1;
	while (cin >> t[*numT].weight >> t[*numT].strength)
		(*numT)++;
	(*numT)--;
}
void process(Turtle* t, int numT)
{
	int i, j;
	int dynamic[2][MAX_SIZE];
	int result;
	sort(&t[1], &t[numT+1], turtleGreater);
	for (i = 1; i <= numT; i++)
		dynamic[1][i] = MAX_WEIGHT;
	if (t[1].weight <= t[1].strength)
	{
		dynamic[1][1] = t[1].weight;
	}
	dynamic[1][0] = 0, dynamic[0][0] = 0;
	
	for (i = 2; i <= numT; i++)
	{
		for (j = 0; j <= numT; j++)
		{
			dynamic[i%2][j] = dynamic[(i-1)%2][j];
			if (j != 0 && dynamic[(i-1)%2][j-1] + t[i].weight < dynamic[(i-1)%2][j] && 
				dynamic[(i-1)%2][j-1] + t[i].weight <= t[i].strength)
				dynamic[i%2][j] = dynamic[(i-1)%2][j-1] + t[i].weight;
		}
	}
	for (i = numT; i >= 1; i--)
	{
		if (dynamic[numT%2][i] < MAX_WEIGHT)
		{
			result = i;
			break;
		}
	}
	cout << result << endl;
}
int main()
{
	Turtle turtle[MAX_SIZE];
	int numTurtle;
	input(turtle, &numTurtle);
	process(turtle, numTurtle);
	return 0;
}













