砝码称重与大小交换问题

一、砝码称重问题--运用了“动态规划”的数学方法

1.要求

现有1g、2g、3g、5g、10g、20g的砝码各若干枚,问用这些砝码可以称出多少种不同的重量。(设砝码的总重量不超过1000克,且砝码只能放在天平的一端) 

输入方式:a1 a2 a3 a4 a5 a6 

(表示1g砝码有a1个,2g砝码有a2个,......20g砝码有a6个) 

输出方式:Total=N 

(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况) 

如:输入:1 1 0 0 0 0 

输出:Total=3 表示可以称出1g,2g,3g三种不同的重量。

2.代码

#include <stdio.h> 


int main() 
{ 
  int a[6], m[6], total = 0, i, j, k, f[1001]; 
  for(i = 0; i <= 1000; i++) 
    f[i] = 0; 
  f[0] = 1; 
  m[0] = 1; m[1] = 2; m[2] = 3; m[3] = 5; m[4] = 10; m[5] = 20; 
  for(i = 0; i < 6; i++) 
    scanf("%d", &a[i]); 
  for(i = 0; i < 6; i++) 
  { 
    for(j = 0; j < a[i]; j++) //个数
    { 
      for(k = 1000; k >= m[i]; k--)  //质量
        if(f[k - m[i]] && !f[k]) //如果大小为k-m[i]的重量是可以构成的
        { 
          f[k] = 1; //那么k-m[i]+m[i]即k也是可以构成的
          total++; 
        } 
    } 
  } 
  printf("Total=%d\n", total); 
  return 0; 
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值