zoukankan      html  css  js  c++  java
  • 0-1背包

    0/1背包   package.pas

    【问题描述】

      有1个容量为m的背包,现有n种物品,重量分别为w1,w2…wn,价值分别为v1,v….vn,若每种物品只有1件,求能放入的最大总价值。
    【输入格式】
    第一行:两个整数m(m<=200)和n(n<=30)
    第2~n+1,每行两个整数wi和vi
    【输出格式】
    一个数据,最大总价值
    【输入样例】
    10 4
    2 1
    3 3
    4 5
    7 9
    【输出样例】
    12

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define mem(a) memset(a,0,sizeof(a))
    #define sc1(a) scanf("%lld",&a)
    #define sc2(a,b) scanf("%lld%lld",&a,&b)
    #define sc3(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
    const ll MAXN=1e9+7;
    const ll N=1e5+5;
    ll dp[N];
    int main()
    {
        ll m,n,i,j;
        sc2(m,n);
        ll w[n],v[n];
        for(i=0;i<n;i++)
        {
            sc2(w[i],v[i]);
        }
        mem(dp);
        for(i=0;i<n;i++)
        {
            for(j=m;j>=w[i];j--)
            {
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            }
        }
        cout<<dp[m]<<endl;
    }

    思路

    1、定义dp数组,dp的下标指的是最大重量 dp本身是作为价值的总和 ,当dp的下标值为容量 即为最大值

    2、循环体(很重要)

    for(i=0;i<数量;i++)
    {
           for(j=容量;j>=体积[i];j++)
           {
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            }
    }
  • 相关阅读:
    代码块&继承&final关键字
    Java基础
    我的学习笔记
    CF743C 题解
    洛谷P4180 题解
    洛谷P3402 题解
    洛谷P3919 题解
    Noi.ac#30 题解
    Noi.ac #65题解
    Noi.ac #51题解
  • 原文地址:https://www.cnblogs.com/jackwang-sparrow/p/13365205.html
Copyright © 2011-2022 走看看