砝码称重与大小交换问题
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.代码
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; }