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;
}
原文地址:https://www.cnblogs.com/gabo/p/2458988.html