루오 구 P2918은 [USACO08NOV] 문제에 건초 솔루션을 구매 건초를 구입

P2918 [USACO08NOV] 건초 구매 건초를 구입

제목 설명

농부 존은 공급 부족과 그의 소 (1 <= H <= 50,000) 건초의 파운드 H를 구입할 필요가있다.

그가 알고 N (1 <= N <= 100) 건초 딜러 편리 1..N의 번호. 공급 나는 C_I의 비용 (1 <= C_I <= 5,000) 달러 P_i (1 <= P_i <= 5,000) 건초의 파운드를 포함하는 패키지를 판매하고있다. 각 공급 업체는 가능한 패키지의 무제한을 가지고 있으며, 패키지는 전체 구입해야합니다.

건초 적어도 H 파운드를 구입하기 위해 필요한 최소한의 비용을 찾아 도움말 FJ.

존 건초 주식 그는 소 구입하고자, 소진 된 \ (H (1 \ 당량 H \ 당량 50000) \) 건초의 파운드.

그는 알고 \ (N을 (1 \ 당량 N의 \의 당량 100) \) 회사가 지금 사용하는 건초 \ (1 \)(N \) \ 그 번호를 지정합니다. 첫 번째 \ (나는 \) 회사의 판매 건초 개만 무게 \ (P_i (1 \ 당량 P_i \ 당량 5000) \) 파운드를하는 데 필요한 오버 헤드 \ (C_I (1 \ 당량 C_I \ 당량 5000) \) 각 회사의 건초 공급이 매우 적합, 당신은 무제한 판매 할 수 달러 건초의 많은 베일.

존 적어도 그 구매의 요구를 충족 할 수있는 최소의 비용을 찾을 수 있도록 \ (H \) 건초의 파운드.

입력 형식

  • 라인 1 : 두 개의 공간으로 분리 된 정수 N과 H

  • 라인 2..N + 1 : P_i 및 C_I : 회선 I는 1 개의 공간 분리 된 정수를 포함 +

출력 형식

  • 행 1 : 최소 비용 FJ를 나타내는 하나의 정수 건초 적어도 H 파운드를 얻기 위해 비용을 지불 할 필요가있다.

샘플 입출력

입력 # 1

2 15
3 2
5 3

출력 # 1

9

설명 / 팁

FJ 9의 총 비용에 대한 두 번째 공급 업체 세 가지 패키지를 구입할 수 있습니다.

[생각]

전체 배낭
배낭 매우 흥미로운 주제

[제목] 효과

당신이 살 무제한 각각의 건초 무게와 비용,주기
시간 파운드 건초보다 구입 최소한의 돈을 지출을

[분석] 표제

당신이 가득한 배낭으로 할 수있는 것은 분명하다
데이터 범위를 5000 * 100 아무 문제 없습니다
다음은 템플릿을 완전히 배낭에 따라 실행할 수 있습니다
[내가] 돈의 최소 금액을 나타내는 BB 내가 £ 건초 지출
할 수 IA [X] 케이스를 통해 푸시
(A가 [X] 중 어느 하나 건초 나타낸다)
의 BB이다 IA [X]는] + C [X] 최소 통해 푸시의 경우
와 발견 30 분

[] 오류 원인

최소한 파운드 H 건초에서하는 매우 혼란이며,
도움이되지만 그를 무시할 수
있지만, 사실은 이것이 가장 중요한 장소
는 H보다 파운드 더 건초를 살 수있는 최소한 H
그러나 H 파운드와 제한이 더 이상이
있기 때문에 건초의 번들 최대 5,000 파운드
그래서 H + 5000 파운드의 최대
이유는 무엇입니까? ?
A는 5,000 파운드를 초과하는 경우이므로
그 밖으로 완전히 불필요한 건초 다발 있어야
제거 할 수 건초 어떤 번들 후, 즉 적어도 H의 £ 건초를 만족
하기 때문에 건초 임의 다발 미만 5000 파운드 인
H 플러스보다 크거나 같 마이너스 번호 5000 5000 이후의 수와 같은보다 적은
건초의 H 파운드를 충족하거나 적어도
그렇게 여분의 범위 5000 후과를 위해 그 필요는 없습니다
H + 5000 실행할 때 가득 배낭을 실행
하고 최종 대답은 H-H입니다 이 범위 내에서 최소 +5000

[전체 코드]

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int Max = 55004;
int bb[Max],p[105],c[105];

int main()
{
    int n,h;
    cin >> n >> h;
    memset(bb,999999,sizeof(bb));
    for(register int i = 1;i <= n;++ i)
        cin >> p[i] >> c[i];
    bb[0] = 0;
    for(register int i = 1;i <= n;++ i)
        for(register int j = p[i];j <= h + 5000;++ j)
            bb[j] = min(bb[j],bb[j - p[i]] + c[i]);
    int M = 0x7fffffff;
    for(register int i = h;i <= h + 5000;++ i)
        M = min(M,bb[i]);
    cout << M << endl;
    return 0;
}

추천

출처www.cnblogs.com/acioi/p/11711430.html