Problem Description
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),
要求:
输入方式:a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
输出方式:N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
Input
只有一行,有六个整数,每个数之间用一个空格隔开。
Output
输出N,N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。
SampleInput
1 1 0 0 0 0
SampleOutput
3
Hint:表示可以称出1g,2g,3g三种不同的重量。
思路分析
多重背包模板问题,f[i-w[i]]存在那么f[i]一定存在
#include<bits/stdc++.h>
using namespace std;
int f[1005],w[8]={0,1,2,3,5,10,20},num[7];//f[i]为i重量是否能被称重,1代表可以被前i-1称重,0代表不行2
int main()
{
f[0]=1;//初始化
for(int i=1;i<=6;i++)//读入每个砝码的个数
cin>>num[i];
for(int i=1;i<=6;i++)
for(int j=1;j<=num[i];j++)//拆成01背包问题
for(int k=1000;k>=w[i];k--)//砝码最大重量为1000.
{
if(f[k-w[i]])f[k]=1;//
}
int ans=0;
for(int i=1;i<=1000;i++)
if(f[i])ans++;
cout<<ans<<endl;
}