背包问题 完全背包(爱思创)

前言:

这篇文章还是是为了帮助一些

像我这样的菜鸟

找到简单的题解

问题描述:

设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。

输入格式

第一行:两个整数,M(背包容量)和N(物品数量);

第2~N+1行:每行二个整数Wi、Ci,表示每个物品的重量和价值。

输出格式

仅一行,一个数,表示最大总价值。

样例输入

10 4
2 1
3 3
4 5
7 9

样例输出

max=12

问题提示

对于 30% 的数据:N<=200, M<=200 ;

对于 70% 的数据:N<=5000, M<=5000 ;

对于 100% 的数据:N<=10000, M<=10000,  0<=ci, wi <=1000 

问题解析:

完全背包是01背包的稍微改动

需要考虑每个物品的价值和重量

用到动态规划

还是两道题分别是上一期的进阶

完整代码:

#include <bits/stdc++.h>
using namespace std;
int N,V;
int v[10010],val[10100];
int dp[10010];
int main()
{
    cin>>V>>N;
    for(int i=1; i<=N; i++)
    {
        cin>>v[i]>>val[i];
    }
    for(int i=1; i<=N; i++)
        for(int j=0; j<=V; j++)
        {
            //dp[j]=dp[j];
            if(j>=v[i])
            {
                dp[j]=max(dp[j],dp[j-v[i]]+val[i]);//转换方程
            }
        }
    cout<<"max="<<dp[V];

    return 0;
}

AC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值