您的位置:首页 > 其它

砝码称重与大小交换问题

2014-06-12 10:00 295 查看
一、砝码称重问题--运用了“动态规划”的数学方法

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; 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: