fafu 1001 dp(背包)

View Code
//fafu 1001 dp(背包)



//题意是 n 个人花一定量的钱 在m道菜中各选一道菜(都选不同的)

//要求选完后能够花尽量多的钱



//这题其实就是背包问题,具体看代码



#include <stdio.h>

#include <string.h>



#define N 1005

#define M 55



int n_pers, n_meal, money;

int cost[M], dp[N], cnt[M];



bool cmp(int a, int b)

{

    if(a > b)

        return true;

    return false;

}



int main()

{

    while(scanf("%d%d%d", &n_pers, &n_meal, &money) != EOF)

    {

        for(int i = 0; i < n_meal; ++i)

            scanf("%d", &cost[i]);

        //dp数组下标表示 花的钱数,值表示点几道菜

        memset(dp, -1, sizeof(dp));

        int ans = 0;

        dp[0] = 0;

        for(int i = 0; i < n_meal; ++i) //点第 i 道菜

        {

            for(int j = money; j >= cost[i]; --j)

            {

                int index = j-cost[i];

                if(dp[index] >= 0 && dp[index] + 1 <= n_pers)

                {   //若之前有花 j-cost[i] 这么多,则 可以到达j 这一状态

                    //而且 j-cost[i] 这一状态所点的菜 再加上i 这道菜 不会超过总人数

                    if(dp[j] == -1 || dp[j] > dp[index] + 1 )

                    {

                        if(ans < j)

                            ans = j;    //记录最大花费

                        dp[j] = dp[index] + 1;

                    }

                }

            }

        }

        printf("%d\n", ans);

    }

    return 0;

}

 

你可能感兴趣的:(dp)