【动态规划】简单背包问题II

问题 J: 【动态规划】简单背包问题II

时间限制: 1 Sec  内存限制: 64 MB
提交: 127  解决: 76
[提交] [状态] [讨论版] [命题人:admin]

题目描述

张琪曼:“为什么背包一定要完全装满呢?尽可能多装不就行了吗?”

李旭琳:“你说得对,这和墨老师曾告诉我们的‘日中则昃,月满则亏’是一个道理。”所以,现在的问题是,她们有一个背包容量为v(正整数,0≤v≤20000),同时有n个魔法石(0≤n≤30),每个魔法石有一个体积 (正整数)。要求从n个魔法石中,任取若干个装入包内,使背包的剩余空间为最小。

输入

第一行为一个整数,表示背包容量,第二行为一个整数,表示有n个魔法石,接下来n行,分别表示这n个魔法石的各自体积。

输出

只有一个整数,表示背包剩余空间。

样例输入

24     
6      
8      
3
12
7
9
7

样例输出

0

AC代码

#include <cstdio>

#include <iostream>

#include <algorithm>

#include <cstring>

using namespace std;

int n,v;

int w[100100];

int f[100100];

int zeroone()

{

    for(int i=1;i<=n;i++)

        for(int j=v;j>=w[i];j--)

            f[j]=max(f[j],f[j-w[i]]+w[i]);

    return f[v];

}

int main()

{

    cin>>v>>n;

    for(int i=1;i<=n;i++)

        cin>>w[i];

    cout<<v-zeroone()<<endl;

    return 0;

}

猜你喜欢

转载自blog.csdn.net/YT201758501112/article/details/81459862