完全背包问题(求最大值时,一维dp[ ] 的精确使用)(无限制次数的选择同一个物件时,就是完全背包问题)

本文深入讲解了完全背包问题的解决方法及其实现细节,并提供了一个简单的优化策略:通过比较物品的价值与价格,去除性价比低的选项,从而提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

for(int i=0; i<N; i++)//循环一边,选和不选都max了一遍
        {
            for(v=volume[i]; v<=m; v++)
            {  

//从小到大,从小到大是叠加的过程,也就是从多次选择同一个类型,一个叠加一个,到最大值时,相当于叠加了很多个一样大小空间类型的物件,这就是完全背包问题!!!!!!!!!!!!!!!!!

 

 

还有一个简单的优化↓_↓

当一个物品的价值小于另一个物品的价值,但是价格高于另一个物品,我们就可以不去考虑这个物品。即若两件物品i、j满足c[i]<=c[j]且w[i]>=w[j],则将物品j去掉,不用考虑。我们为什么要买一个又贵又难吃的东西呢(╯▽╰),可以进行一个简单的排序,把又便宜又好吃的东西放在队首,进行优先运算。

 

 

 

 

                                                             

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxm=2001,maxn=101;
int n,m,v,i,num;
int value[maxn],volume[maxn];
int dp[maxm];

//int dp[1006];
//int value[1006];
//int volume[1006];

int main()
{
    scanf("%d%d",&m,&num);            //背包容量m和物品数量n
    for(i=1; i<=num; i++)
        scanf("%d%d",&value[i],&volume[i]);

    for(i=1; i<=num; i++)
    {
        for(v=volume[i]; v<=m; v++)//设 f[v]表示重量不超过v公斤的最大价值
        {                       //这里是v++ 顺序 区别于01背包
            dp[v] = max( dp[ v-volume[i] ] + value[i], dp[v]);
        }
    }




    printf("%d\n", dp[m]);           // f[m]为最优解
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值