hdu 3033 I love sneakers!(DP)

2083 단어
클릭하여 링크 열기
제목 의미
조별 가방 문제, 대의**신발을 사야 합니다. k가지 브랜드가 있고 각 브랜드는 적어도 신발 한 켤레를 사야 합니다.신발마다 표시 가격과 실제 가치가 있다.m이 넘는 돈으로 가장 값진 신발을 사세요.사실 나는 이 문제의 난점이 적어도 이 점을 처리하는 데 있다고 생각한다.상태방정식은 많은 사람들이 dp[k][m]로 이미 k종의 신발을 샀는데 m돈이 있는 상태의 신발의 최대 가치를 나타낼 수 있다.상태 전이 방정식은 for(k=1;k <=K;k++) {for(i=0;i =m[k][i].m; j-) {if(dp[k][j-m][k][k]]].m]!;                     if(dp[k-1][j - m[k][i].m] != -1 )                         dp[k][j] = Max(dp[k][j] , dp[k-1][j - m[k][i].m] + m[k][i].v); }}} 만약 두 개의 빨간색 판단문을 소홀히 했다면 모두가 이것이 단순한 01배낭일 뿐이고 조건 제한이 없다는 것을 알아차렸을 것이다. 이 두 마디를 더하면 적어도 실현할 수 있을 것이다.이유는 다음과 같다. 처음에 나는 dp[][]수조를 -1로 초기화하여 모든 수가 합법적이지 않다는 것을 나타낸다.0보다 크면 합법적임을 표시하고 모든 k=0dp[0][]를 0으로 한다. 이것은 k=1시에 합법적으로 계산할 수 있도록 하는 것이다.상태 방정식에서 알 수 있듯이 지난번 상태 값이 -1이었을 때 그는 비합법적이었다.그래서 현재 상태는 계산할 필요도 합법적이지 않다.만약에 제k류 상품의 수치를 계산한 후 모든 dp[k][]가 모두 -1일 때 제k류는 한 신발도 사지 않았다는 것을 나타낸다.그러므로 모든 상태가 합법적이지 않고 그 다음의 모든 값도 합법적이지 않을 것이다.제k조 상품을 계산하는 과정에서 어떤 -1이 비음수로 변할 때 현재의 제k종은 이미 제i물품을 가져왔기 때문에 합법적인 답안이 되었다.이렇게 미루면 마지막 값 dp[k][m]가 답이다.만약 여전히 -1이라면,impossible 핸들을 출력하십시오.
#include"stdio.h"
#include"string.h"
#define max(x,y) x>y?x:y;
int dp[11][10001];
int main()
{
	int N,M,K,i,j,k;
	int cost[11][101],value[11][101],a,b,c,num[11];
	while(scanf("%d%d%d",&N,&M,&K)!=-1)
	{
		memset(dp,-1,sizeof(dp));
		memset(num,0,sizeof(num));
		for(i=0;i<N;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			cost[a][num[a]]=b;
			value[a][num[a]]=c;
			num[a]++;
		}
		for(i=0;i<M;i++)
			dp[0][i]=0;
		for(i=1;i<=K;i++)
		{
			for(j=0;j<num[i];j++)
			{
				for(k=M;k>=cost[i][j];k--)
				{
					//           。。
					if(dp[i][k-cost[i][j]]!=-1)
						dp[i][k]=max(dp[i][k],dp[i][k-cost[i][j]]+value[i][j]);
					if(dp[i-1][k-cost[i][j]]!=-1)
						dp[i][k]=max(dp[i][k],dp[i-1][k-cost[i][j]]+value[i][j]);
				}
			}
		}
		if(dp[K][M]==-1)
			printf("Impossible
"); else printf("%d
",dp[K][M]); } return 0; }

좋은 웹페이지 즐겨찾기