[01가방][HAOI 2012] 볼륨 조절

2134 단어 DP배낭.

제목 설명


기타리스트 한 명이 공연에 참가할 준비를 하고 있다.그는 공연할 때 항상 같은 음량을 사용하는 것을 좋아하지 않기 때문에, 그는 모든 노래를 결정하기 전에 한 번씩 음량을 바꾸어야 한다.공연이 시작되기 전에, 그는 모든 노래가 시작되기 전에 그가 바꾸고 싶은 음량이 얼마나 되는지 리스트를 작성했다.매번 음량을 바꿀 때마다 그는 높일 수도 있고 낮출 수도 있다.
음량을 정수로 묘사하다.파일의 정수 Begin Level을 입력하면 기타가 처음 시작되는 볼륨을 나타내고, 정수 max Level은 기타의 최대 볼륨을 나타냅니다.음량은 0보다 작거나 maxLevel보다 크면 안 됩니다.입력 중 n개의 정수 c1, c2, c3을 지정했습니다.cn, i곡이 시작되기 전에 기타리스트가 바꾸고 싶은 음량이 얼마나 되는지 나타낸다.    
기타리스트는 마지막 곡을 최대 음량으로 연주하고 싶은데, 너의 임무는 이 최대 음량을 찾는 것이다.
입력 출력 형식
[형식 입력]:
첫 번째 줄은 세 개의 정수 n, begin Level, max Level 순이다.
두 번째 줄은 n개의 정수 c1, c2, c3,...,cn.
데이터 크기 조정:
        1<=n<=50, 1<=ci<=maxLevel, 1<=maxLevel<=1000, 0<=beginLevel<=maxLevel
[출력 형식]:
마지막 곡을 연주하는 최대 음량을 출력하다.만약 기타리스트가 음량이 0보다 낮거나 maxLevel보다 높다면 출력은 -1이다.
[샘플 입력]: [샘플 출력]
        3 5 10                                                                       10
        5 3 7
F[i, j]는 i번 트랙 시 음량 j가 도달할 수 있는지를 나타낸다.
F【0】【befinLevel】=1 초기화;
가방 DP를 만들면 됩니다.
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,s,maxx;
bool f[55][1005];
int main()
{
	scanf("%d%d%d",&n,&s,&maxx);
	f[0][s]=1;
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		for(int j=0;j<=maxx;j++)
		{
			if(j-x>=0&&f[i-1][j-x])
			{
				f[i][j]=1;
			}
			if(j+x<=maxx&&f[i-1][j+x])
			{
				f[i][j]=1;
			}
		}
	}
	for(int i=maxx;i>=0;i--)
	{
		if(f[n][i])
		{
			printf("%d",i);
			return 0;
		}
	}
	printf("-1");
	return 0;
}

좋은 웹페이지 즐겨찾기