http://acm.hdu.edu.cn/showproblem.php?pid=2546

01背包,开始内层循环写成v>=0无限wa。。。一定要注意数组越界的问题、、、

View Code
#include <iostream>
using namespace std ;
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        int w[1010];
        int maxx=0;
        int flag;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&w[i]);
            if(maxx<w[i]){
                maxx=w[i];
                flag=i;
            }
        }
        int m;
        scanf("%d",&m);
        if(m<5)
            printf("%d\n",m);
        else
        {
            int f[1010];
            memset(f,0,sizeof(f));
            for(int i=1;i<=n;i++)
            {
                if(i==flag)continue;
                for(int v=m-5;v>=w[i];v--)
                    f[v]=max(f[v],f[v-w[i]]+w[i]);
            }
            printf("%d\n",m-f[m-5]-maxx);
        }
    }
    return 0;
}