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 }