背包经典问题:
背包问题01:
一个背包容积为T(0<=T<=2000),现在有N(0<N<=1000)个物品,每个物品有一定体积V(1<=V<=5000)。从这N个物品中选取若干个装入背包内,使背包所剩的空间最小。请求出最小的剩余空间?
代码如下:
#include<cstdio>
using namespace std;
int s[1005];
bool f[3000];
int main(){
int i,k,ans=0,v,n;
scanf("%d%d",&v,&n);
for(i=1;i<=n;i++)scanf("%d",&s[i]);
f[0]=true;
for(i=1;i<=n;i++)
for(k=v;k>=s[i];k--)//物品有限,反序枚举空间;
if(f[k-s[i]])f[k]=true;//f[k-s[i]]=true表示状态f[k]可以通过加上s[i]达到;
for(i=v;i>0;i--)//找出答案;
if(f[i]){printf("%d",v-i);return 0;}
}
背包问题02
若每种物品有无限多个。从这N种物品中选取若干个装入背包内,使背包所剩的空间最小。请求出最小的剩余空间?