总时间限制: 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;
}
附上一个容易理解的大佬网址