Do Palapala (this)

时间:2023-03-10 03:19:03
Do Palapala (this)

Description

伟大的中国人民有宝箱容量为S(0<=S<=20000),有m个物品(0<m<=30,每个物品有一个体积(正整数)。任取若干个装入箱内,使箱子的剩余空间为最小。

Input

(this.in)

一个整数,表示箱子容量
一个整数,表示有m个物品
接下来m行,分别表示这m个物品的各自体积

Output

(this.out)

一个整数表示箱子剩余空间。

SampleInput&Output

#1

24

6

8

3

12

7

9

7

#1

0

=-=

首先,读题,就知道这是一道很渣逼的水题。最基础的动归背包问题。学长改的题目就是一个暗示(DP(动态归划))(教练安排学长出题,学长就改noip题发给我们@-@。。。。)。。。。。

好了,分析题目,题目的意思大致可以转化为:有一个大小为S的背包,有m个物品,每个物品都有各自的大小,求背包内能装下最多的物品体积(不过最后输出背包的剩余空间)。

读懂了题就很简单了————————

通过动归一遍过。(学长给的题本来以为很水直接暴,结果只过了两个点。。。。。。。。。 受教训了。。。再也不上来随便暴了。。。。)

代码如下:

 #include<iostream>
#include<cstdio>
using namespace std;
const int maxxiangzi=;
const int maxwupin=;
int m,n,dangqian=;
int f[maxxiangzi]={};
int a[maxwupin]={},c[maxwupin]={};
int main()
{
freopen("this.in","r",stdin);
freopen("this.out","w",stdout);
cin>>m>>n;
for(int i=;i<=n;i++)
{
cin>>a[i];
c[i]=a[i];
}
for(int i=;i<=n;i++)
for(int v=m;v>=a[i];v--)
if(f[v-a[i]]+c[i]>f[v])
f[v]=f[v-a[i]]+c[i];
cout<<m-f[m];
}