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/archive/2012/04/20/2458988.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值