游客 Signup | Login
中文 | En

2346 - 装箱问题

有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。

要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

<br />

Input

每个测试文件只包含一组测试数据,每组输入的第一行为一个整数V(0<=V<=20000),表示箱子的容量。

第二行输入一个整数n(0<n<=30),表示有n个物品。

接下来n行,每行输入一个正整数,表示每个物品的体积。


Output

对于每组输入数据,输出一个整数,表示箱子剩余空间。


Examples

Input

24
6
8
3
12
7
9
7

Output

0

Solution C

#include<stdio.h>
void main()
{
	int f[20001]={0},o[31],i,j,v,n;
	scanf("%d%d",&v,&n);
	for (i=0;i<n;i++) scanf("%d",&o[i]);
	f[0]=1;
	for (i=0;i<n;i++) 
     	for (j=v;j>=0;j--)
			if (j-o[i]>=0) 
				if (f[j-o[i]]) f[j]=1;
    for (j=v;j>=0;j--) if (f[j]) break;
	printf("%d",v-j);
}

Solution C++

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int V,n,w[35],f[20005];
cin>>V>>n;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++){
for(int j=V;j>=w[i];j--){
f[j]=max(f[j],f[j-w[i]]+w[i]);
}
}
cout<<V-f[V]<<endl;
return 0;
}
Time Limit 1 second
Memory Limit 125 MB
Discuss Stats
上一题 下一题