回顾下背包的问题先来最简单的0-1背包,HDU 2546 很裸的0-1背包。
1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
-45 32
#include <cstdio> #include <cstdlib> #include <cstring> #include <climits> const int MAX = 1011; int price[MAX],cost[MAX]; void init(int n){ int i; for(i=0;i<=n;++i){ cost[i] = 0; } } max(int &a,int b){ if(a<b)a=b; } void zeroOnePack(int V,int n,int pos){ int i,v; for(i=0;i<n;++i){ if(i==pos)continue; for(v=V;v>=price[i];--v){ max(cost[v],cost[v-price[i]]+price[i]); } } } int main(){ int n,m,maxp,pos,i; //freopen("in.txt","r",stdin); while(scanf("%d",&n) && n){ maxp = -1; for(i=0;i<n;++i){ scanf("%d",&price[i]); if(price[i]>maxp){ maxp = price[i]; pos = i; } } scanf("%d",&m); if(m-5<0){ printf("%d\n",m); continue; } init(m); zeroOnePack(m-5,n,pos); printf("%d\n",m-cost[m-5]-maxp); } return 0; }