poj 1252_完全背包

题目描述:

   凑数字问题。给六个纸币面额,用最少的这六个纸币凑出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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值