题目描述:
凑数字问题。给六个纸币面额,用最少的这六个纸币凑出1-100的面值,求这1-100需要的纸币数种的最大值。
解题思路:
完全背包。要注意的有:(1)可以加和得到,也可以相减得到。加和面额的值需要在相减面额的值之前算好。(2)注意上限…………因为可以相减得到。所以上限需要测试最大的数列,如1 95 96 97 98 99。
代码:
#include <stdio.h>
#include <stdlib.h>
#define V 2001
#define Infinity 100000
#define UP 1189//介个,。。。。。
int p[7], f[V];
double sum;
int max, num, i, v, k;
main()
{
scanf("%d",&num);
for(k=1;k<=num;k++)
{
for(i=1;i<=6;i++)
scanf("%d",&p[i]);
//init
f[0] = 0;
for(i=1;i<=UP;i++)
f[i] = Infinity;
//cal f[]
for(i=1;i<=6;i++)
for(v=p[i];v<=UP;v++)
f[v] = (1+f[v-p[i]]) < f[v] ? (1+f[v-p[i]]) : f[v] ;
//cal result
for(i=1;i<=6;i++)
for(v=UP-p[i];v>=1;v--)
f[v] = (1+f[v+p[i]]) < f[v] ? (1+f[v+p[i]]) : f[v];
sum = 0;
max = 0;
for(v=1;v<=100;v++)
{
sum+=f[v];
max = max>f[v] ? max:f[v];
}
printf("%.2f %d\n",sum/100,max);
}
//system("pause");
return 0;
}