dp之多维背包hdu4501

思路:将v1,v2,k都当作一种体积,每种物品只能取一次,求max.......

反思:以前写背包,由于只有一个体积,所以习惯性的在for中,就所取的最小值限制,而在这次,因为这里导致wa了,具体是因为在多个体积限制的背包里,当这个体积小于它的最小体积时,它可以不去减它的最小体积,而是作为一种状态来传递其他体积的限制的值........

wa代码:

#include<iostream>

#include<stdio.h>

#include<string.h>

using namespace std;

int dp[105][105][110],s[105][3];

int max(int x,int y)

{

    if(x>y)

    return x;

    else

    return y;

}

int main()

{

    int n,v1,v2,k;

    while(scanf("%d%d%d%d",&n,&v1,&v2,&k)>0)

    {

        for(int i=1;i<=n;i++)

        scanf("%d%d%d",&s[i][0],&s[i][1],&s[i][2]);

        memset(dp,0,sizeof(dp));

        for(int i=1;i<=n;i++)

        {

            for(int j=v1;j>=s[i][0];j--)

            {

                for(int p=v2;p>=s[i][1];p--)

                {

                    for(int q=k;q>=0;q--)

                    {

                        int maxx=0;

                        if(maxx<dp[j-s[i][0]][p][q]+s[i][2])

                        maxx=dp[j-s[i][0]][p][q]+s[i][2];

                        

                        if(maxx<dp[j][p-s[i][1]][q]+s[i][2])

                        maxx=dp[j][p-s[i][1]][q]+s[i][2];

                        

                        if(q>0&&maxx<dp[j][p][q-1]+s[i][2])

                        maxx=dp[j][p][q-1]+s[i][2];

                        

                        if(maxx<dp[j][p][q])

                        maxx=dp[j][p][q];

                        dp[j][p][q]=maxx;

                    }

                }

            }

        }

        printf("%d\n",dp[v1][v2][k]);

    }

    return 0;

}

 ac代码:

#include<iostream>

#include<stdio.h>

#include<string.h>

using namespace std;

int dp[105][105][110],s[105][3];

int max(int x,int y)

{

	if(x>y)

	return x;

	else

	return y;

}

int main()

{

	int n,v1,v2,k;

	while(scanf("%d%d%d%d",&n,&v1,&v2,&k)>0)

	{

		for(int i=1;i<=n;i++)

		scanf("%d%d%d",&s[i][0],&s[i][1],&s[i][2]);

		memset(dp,0,sizeof(dp));

		for(int i=1;i<=n;i++)

		{

			for(int j=v1;j>=0;j--)

			{

				for(int p=v2;p>=0;p--)

				{

					for(int q=k;q>=0;q--)

					{

						int maxx=0;

						if(j>=s[i][0]&&maxx<dp[j-s[i][0]][p][q]+s[i][2])

						maxx=dp[j-s[i][0]][p][q]+s[i][2];

						

						if(p>=s[i][1]&&maxx<dp[j][p-s[i][1]][q]+s[i][2])

						maxx=dp[j][p-s[i][1]][q]+s[i][2];

						

						if(q>0&&maxx<dp[j][p][q-1]+s[i][2])

						maxx=dp[j][p][q-1]+s[i][2];

						

						if(maxx<dp[j][p][q])

						maxx=dp[j][p][q];

						dp[j][p][q]=maxx;

					}

				}

			}

		}

		printf("%d\n",dp[v1][v2][k]);

	}

	return 0;

}

 

你可能感兴趣的:(HDU)