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题发给我们@[email protected]。。。。)。。。。。
好了,分析题目,题目的意思大致可以转化为:有一个大小为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 }
时间: 2024-10-16 17:02:48