01背包例题

大大的去了:

洛谷P1049

传送门

二维数组题解:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int v,n;//V表示箱子容量,n表示物品数量
    int a[35];//物品体积
    int f[35][20005];
    cin>>v>>n;

    for(int i=1;i<=n;i++)
    cin>>a[i];

    for(int i=1;i<=n;i++)
    for(int j=a[i];j<=v;j++)
    //或者:for(int j=v;j>=a[i];j--)//
    f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+a[i]);

    cout<<v-f[v];//注意,要输出剩余体积,而不是f[v]!
}

一维数组题解:

#include<iostream>
using namespace std;
int v,n;
int s[40];
int f[2000020];
int main()
{
    cin>>v>>n;
    for(int i=1;i<=n;i++)
    cin>>s[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=v;j>=s[i];j--)
        {
            if(f[j]<f[j-s[i]]+s[i])
            {
                f[j]=f[j-s[i]]+s[i];
            }
        }
    } 
    cout<<v-f[v];
    return 0;
}

第二题:

洛谷P1164

传送门ლ(′◉❥◉`ლ)

按照大佬们的说法,这是一题奇妙的01背包水题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=10000+10;
int v[maxn],f[maxn];
int main(){
    int n,m;
    cin>>n>>m;
    f[0]=1;
    for(int i=1;i<=n;++i)    
        cin>>v[i];//读入 价值
    for(int i=1;i<=n;++i)
        for(int j=m;j>=v[i];--j)
            f[j]+=f[j-v[i]];//现在的花费+=我不点这个菜的时候的花费
    cout<<f[m]<<endl;最后把最后一个点的花费输出来就可以了
    return 0;
}
原文地址:https://www.cnblogs.com/U58223-luogu/p/9538060.html