总时间限制: 1000ms
内存限制:65536kB

描述

设有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三种不同的重量。

思路

采用动态规划的方法来做。
对于质量 i , dp [ i ] = 1,表示砝码可以组成重量 i ;dp [ i ] = 0,表示不可以组成。
我们依次处理每个砝码,对于第 j 个砝码,质量为 wj 。
推导公式为:
dp [ i - wj ] = 1 ==> dp [ i ] = 1 (若 i - wj 可以称到,则 i 也可以被称到)
代码:

#include<stdio.h>
#include<math.h>
int dp[1010];
int kg[6]={1,2,3,5,10,20};//记录每种砝码的质量
int num[6];//记录每种砝码的数量
int main( )
{
	int sum=0,ans=0;
	for(int i=0;i<6;i++)
	{
		scanf("%d",&num[i]);
		sum+=num[i]*kg[i];
	}
	dp[0]=1;
	for(int i=0;i<6;i++)
	{
		for(int j=1;j<=num[i];j++)
		{
			for(int k=sum;k>=kg[i];k--)
			{
				if(dp[k-kg[i]]==1) dp[k]=1; 
			}
		}
	}
	for(int i=1;i<=sum;i++)
	{
		if(dp[i]==1) ans++;
	}
	printf("Total=%d",ans);
	return 0;
}

附上一个容易理解的大佬网址