http://www.elijahqi.win/archives/510
题目描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入输出格式
输入格式:
一个整数,表示箱子容量
一个整数,表示有n个物品
接下来n行,分别表示这n 个物品的各自体积
输出格式:
一个整数,表示箱子剩余空间。
输入输出样例
输入样例#1:
24
6
8
3
12
7
9
7
输出样例#1:
0
说明
NOIp2001普及组 第4题
include<cstdio>
#include<cstring>
int max(int x,int y){
if (x>y) return x;return y;
}
int a[33],data[33][22000];
int n,v;
void f(int i,int x){
if (i==0||x==0) {data[i][x]=0;return;}
if (data[i-1][x]==-1) f(i-1,x);
if (x>=a[i]){
if (data[i-1][x-a[i]]==-1)f(i-1,x-a[i]);
data[i][x]=max(data[i-1][x],data[i-1][x-a[i]]+a[i]);
}else{
data[i][x]=data[i-1][x];
}
}
int main(){
//freopen("1049.in","r",stdin);
//freopen("1049.out","w",stdout);
scanf("%d",&v);scanf("%d",&n); memset(data,-1,sizeof(data));
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
f(n,v);
/*for (int i=1;i<=n;++i){
for (int j=0;j<=v;++j) printf("%d ",data[i][j]);
printf("\n");
}*/
//printf("%d",data[n][v]);
printf("%d",v-data[n][v]);
return 0;
}