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]);
        }
}
cout<<dp[容量]<<endl;