完全背包问题,今天才知道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]就是对应的使用物品总数。