[DP 가방 문제 1] noi openjudge 2.6 채약

5016 단어 DP
제목:

1775:약초 채취


  • 총 시간 제한:
    1000ms 
    메모리 제한:
    65536kB
    묘사
    천진은 매우 잠재력이 있고 타고난 자질이 총명한 아이로 그의 꿈은 세계에서 가장 위대한 의사라고 불리는 것이다.그래서 그는 근처에서 가장 명망이 높은 의사를 스승으로 모시고 싶었다.의사는 그의 자질을 판단하기 위해 그에게 어려운 문제를 하나 냈다.의사는 그를 약초가 널려 있는 동굴로 데리고 가서 말했다. "얘야, 이 동굴에는 다른 약초가 있어. 한 그루씩 따는 데 시간이 좀 걸릴 거야. 한 그루마다 가치가 있어. 내가 시간을 줄게. 그 동안 약초를 따도 돼. 똑똑한 아이라면 채취한 약초의 총 가치가 가장 클 거야."
    만약 네가 진진이라면, 너는 이 임무를 완성할 수 있니?
    입력
    입력한 첫 줄에는 두 개의 정수 T(1<=T<=1000)와 M(1<=M<=100)이 있는데, T는 모두 약초를 채취할 수 있는 시간을 대표하고, M은 동굴 속의 약초의 수를 대표한다.다음 M행은 줄마다 1에서 100 사이(1과 100 포함)의 정수 두 개를 포함하여 각각 어떤 약초를 따는 시간과 이 약초의 가치를 나타낸다.
    출력
    수출은 한 줄만 포함하고 이 줄은 한 정수만 포함하며 규정된 시간 안에 채취할 수 있는 약초의 최대 총가치를 나타낸다.
    샘플 입력
    70 3
    71 100
    69 1
    1 2
    

    샘플 출력
     3
    분석:
    비할 바 없이 고전적인 가방 문제 01, f[v]로 v 단위 시간 획득할 수 있는 최대 가치를 표시하고,
    w[i]는 시간, c[i]는 가치, 모든 물품에 대한 선택, 선택하지 않음
    선택하지 않음: f[v]=f[v];
    선택: f[v]=f[v-w[i]]+c[i];(v>=w[i])
    상태 전이 방정식은 다음과 같다. f[v]=max(f[v], f[v-w[i]]+c[i]).
    코드는 다음과 같습니다.
    #include
    int max(int x,int y){return x>y?x:y;}
    int f[1001],v,n,i,w[101],c[101],m;
    int main()
    {
    	scanf("%d%d",&m,&n);
    	for(i=1;i<=n;i++)
    		scanf("%d%d",&w[i],&c[i]);
    	for(i=1;i<=n;i++)
    		for(v=m;v>=w[i];v--)
    			f[v]=max(f[v],f[v-w[i]]+c[i]);
    	printf("%d",f[m]);
    }

    좋은 웹페이지 즐겨찾기