我试过,这样做可以的:
#include <stdio.h>
#include <string.h>
int main()
{
int n,m,s,i,j,f[1001],c;
while(scanf("%d%d%d",&n,&m,&s) == 3)
{
memset(f,0,sizeof(f));
f[0] = 1;
for(i=0;i<m;i++)
{
scanf("%d",&c);
for(j=s;j>=c;j--)
if(f[j-c]) //因为现在物品的体积为val[i],你要构成j必需要从 j-val[i]这个积体的状态得到的,如果j-val[i]体积不为真的话就是说j-val[i]体积的状态不存在,不能构成j的状态
{
if(!f[j] && j == c) f[j] = 1;
else if(!f[j] || f[j]>f[j-c]+1)//这里f[j]>f[j-c]+1的原因是f[j]是没取第i件物品时取了的物品数;f[j-c]+1是取了第i件物品是的物品总数,取了的价值比没取的大并且件数小,所以是">"
f[j] = f[j-c]+1;
}
}
for(i=s;i>=0;i--)
if(f[i] && f[i]<= n)
{
printf("%d\n",i);
break;
}
}
return 0;
}