完全背包问题,今天才知道0、1背包就是每种物品只有一个,而完全背包就是每种不限。这题又是抄的,不过我自己独立地敲了一遍。
1 #include<stdio.h> 2 #include<string.h> 3 #define MAXN 10010 4 int f[MAXN],num[MAXN],a[4]; 5 int main() 6 { 7 int T,i,j; 8 while(~scanf("%d%d%d",&a[1],&a[2],&T)) 9 { 10 memset(f,0,sizeof(f)); 11 memset(num,0,sizeof(f)); 12 for(i = 1; i < 3; i++) 13 for(j = a[i]; j <= T; j++) 14 if(f[j - a[i]] + a[i] > f[j]) 15 f[j] = f[j - a[i]] + a[i], 16 num[j] = num[j - a[i]] + 1; 17 else if(f[j - a[i]] + a[i] == f[j] && num[j - a[i]] + 1 > num[j]) 18 num[j] = num[j - a[i]] + 1; 19 if(f[T] == T) 20 printf("%d\n",num[T]); 21 else 22 printf("%d %d\n",num[T],T-f[T]); 23 } 24 return 0; 25 }
其中f[j]表示填充一个容积为j的包最多能填多少空间,num[j]就是对应的使用物品总数。