codeforces 106C 背包DP

codeforces 106C


题意:

给 定 n 克 面 粉 , m 种 馅 料 , 第 i 种 馅 料 有 a i 克 , 使 用 第 i 种 馅 料 制 作 价 值 v i 的 面 包 消 耗 b i 克 馅 料 和 w i 克 面 粉 。 给定n克面粉,m种馅料,第i种馅料有a_i克,使用第i种馅料制作价值v_i的面包消耗b_i克馅料和w_i克面粉。 nmiai,使ivibiwi
给 定 c 和 d , 你 可 以 单 独 用 c 克 面 粉 制 作 价 值 为 d 的 面 包 。 给定c和d,你可以单独用c克面粉制作价值为d的面包。 cdcd
问 最 大 收 益 。 问最大收益。


题解:

n u m [ i ] 表 示 第 i 种 馅 料 的 数 量 , 将 问 题 转 化 为 多 重 背 包 。 num[i]表示第i种馅料的数量,将问题转化为多重背包。 num[i]i
d p [ j ] 表 示 说 利 用 n 克 面 粉 制 作 出 面 包 的 最 大 收 益 。 dp[j]表示说利用n克面粉制作出面包的最大收益。 dp[j]n

  • d p [ j ] = m a x ( d p [ j ] , d p [ j − k ∗ w [ i ] ] + k ∗ v [ i ] ) dp[j] = max(dp[j], dp[j-k*w[i]]+k*v[i]) dp[j]=max(dp[j],dp[jkw[i]]+kv[i])

#include <bits\stdc++.h>
using namespace std;
const int N = 1001;
int w[11], v[11], num[11];
int dp[N];

int main() {
    int n, m, a, b;
    cin >> n >> m >> w[m] >> v[m];
    num[m] = n/w[m];
    for(int i = 0 ; i < m ; i++){
        cin >> a >> b >> w[i] >> v[i];
        num[i] = a/b;
    }
    for(int i = 0 ; i <= m ; i++){
        for(int j = n ; j >= w[i] ; j--){
            for(int k = 0 ; k <= min(num[i], j/w[i]) ; k++){
                dp[j] = max(dp[j], dp[j-k*w[i]]+k*v[i]);
            }
        }
    }
    cout << dp[n] << endl;
    return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值