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个物品,每个物品都有各自的大小,求背包内能装下最多的物品体积(不过最后输出背包的剩余空间)。

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

 

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

 

 

代码如下:

 

 1 #include<iostream> 
 2 #include<cstdio>
 3 using namespace std;
 4 const int maxxiangzi=20000;
 5 const int maxwupin=30;
 6 int m,n,dangqian=0;
 7 int f[maxxiangzi]={0};
 8 int a[maxwupin]={0},c[maxwupin]={0};
 9 int main()
10 {
11     freopen("this.in","r",stdin);
12     freopen("this.out","w",stdout);
13     cin>>m>>n;
14     for(int i=1;i<=n;i++)
15     {
16         cin>>a[i];
17         c[i]=a[i];
18     }
19     for(int i=1;i<=n;i++)
20         for(int v=m;v>=a[i];v--)
21             if(f[v-a[i]]+c[i]>f[v])
22                 f[v]=f[v-a[i]]+c[i];
23     cout<<m-f[m];    
24 }

 

原文地址:https://www.cnblogs.com/zhangone/p/5001757.html