砝码称重问题:设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其质量<=1000g),求出用他们能称出的质量的种类数(不包括质量为0的情况)。
设dp[1000]数组为标记数组。当dp
本题目中有多个砝码,我们顺序处理每一个砝码。
当处理第j个砝码,质量为wj时,有下列推导公式:
完整程序代码如下:
#include <iostream>
#include <string.h>
using namespace std;
int w[6]={1,2,3,5,10,20};
int a[6]={0};
int sum=0;
int dp[1005];
int main()
{
for(int i=0;i<6;i++)
{
cin>>a;
sum+=a*w;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<6;i++) //6种不同砝码
{
for(int j=0;j<=a;j++) //对应的6种不同数量
{
for(int k=sum;k>=dp[dp[i-1]];k--) //对应的可能去的数量
{
if(dp[k-a[j]*w]==1)
{
dp[k]=1;
}
}
}
}
int tot=0;
for(int i=1;i<=sum;i++)
{
if(dp)
tot++;
}
cout<<tot<<endl;
return 0;
}