0
点赞
收藏
分享

微信扫一扫

Dp基础 简单背包问题


背包问题大意:给你一个背包有一定的容量,再给你一下些物品,物品有自己的体积和价值,请你选择价值和最大的一些物品(最体积不超过背包的容量)

 

背包问题思路:逐渐放每一个物品,找到当前体积的最大价值。

           背包问题的主要代码

   

for(i=1;i<=n;i++)  //逐渐放一个物品
      for(j=m;j>=w[i];j--)  // 枚举背包放下这个物品的情况,j为背包的体积,当j<w[i] 背包放不下这个物品,所以不考虑这种情况
        {
        dp[j]=max(dp[j],dp[j-w[i]]+v[i]); // 比较当前背包体积为j的价值 与 背包体积为j-w[i](这个物品的体积) 的价值加上这个物品的价值
   }

#include<stdio.h>
#include<string.h>
const int M=13000;  // 背包的最大体积(不同题不一样)
const int N=3500;  // 物体数量(也与题目给的范围有关)
int w[N], v[N];   //w[N] 存储物体的重量(体积)  v[N]存储物体的价值
int dp[M];       // 体积的最优解
int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
int main()
{
    int i, j, n, m;
    scanf("%d %d",&n,&m);// n:物品的数量  m:背包的体积
    for(i=1; i<=n; i++)
    {
        scanf("%d %d",&w[i],&v[i]);
    }
    memset(dp,0,sizeof(dp));

    for(i=1; i<=n; i++)
        for(j=m; j>=w[i]; j--)
        {
            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        }
    printf("%d\n",dp[m]);
    return 0;
}

 

 

 

举报

相关推荐

0 条评论