asuml

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

时间限制: 1 Sec  内存限制: 64 MB

题目描述

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

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

输入

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

输出

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

样例输入

24     
6      
8      
3
12
7
9
7

样例输出

0

#include <iostream>
#include <cstring>

using namespace std;
int m,n,a[33],f[22222];
void OneZeroPack(int m,int v,int w)  //0-1背包
{
    for(int i=m;i>=v;i--)
        f[i]=max(f[i],f[i-v]+w);
}

int main()
{
    while(cin>>m>>n)
    {
        for(int i=0;i<n;i++)
            cin>>a[i];
        memset(f,0,sizeof(f));
        for(int i=0;i<n;i++)
            OneZeroPack(m,a[i],a[i]);
        cout<<m-f[m]<<endl;
    }
    return 0;
}

 

posted on 2016-08-03 17:40  asuml  阅读(445)  评论(0编辑  收藏  举报