Description
设有1g,2g,3g,5g,10g,20g的砝码各若干枚(其总重≤1000g)。
Format
Input
a1,a2,a3,a4,a5,a6(表示 1g 砝码有 a1 个,2g 砝码有 a2 个,....20g 砝码有 a6 个)
Output
Total=N(N 表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
Samples
输入数据 1
1 1 0 0 0 0
输出数据 1
Total=3
Hint
表示可以称出1g,2g,3g三种不同的重量
Limitation
1s, 1024KiB for each test case.
方法一:
六重循环暴力枚举标记每种情况再遍历并输出。
程序:
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,e,f,ans,z,s[1010];
int main(){
cin>>a>>b>>c>>d>>e>>f;
for(int i=0;i<=a;i++){
for(int j=0;j<=b;j++){
for(int k=0;k<=c;k++){
for(int l=0;l<=d;l++){
for(int m=0;m<=e;m++){
for(int n=0;n<=f;n++){
z=i+j*2+k*3+l*5+m*10+n*20;
s[z]=1;
}
}
}
}
}
}
for(int i=1;i<=1000;i++)
if(s[i]==1)
ans++;
cout<<"Total="<<ans;
return 0;
}
然而。。。
这节课上的是背包!!!
所以~~~
方法二:
也是循环,每种过一遍,看到标记就往下标,看到标记就往下标,最后遍历并输出。
程序:
#include <bits/stdc++.h>
using namespace std;
bool dp[1005];
int a[7],b[7]={0,1,2,3,5,10,20},ans,maxn;
int main(){
dp[0]=true;
for(int i=1;i<=6;i++){
cin>>a[i];
maxn+=a[i]*b[i];
}
for(int i=1;i<=6;i++)
for(int j=1;j<=a[i];j++)
for(int k=maxn;k>=0;k--)
if(dp[k]==true)
dp[k+b[i]]=true;
for(int i=1;i<=maxn;i++)
if(dp[i])
ans++;
cout<<"Total="<<ans;
return 0;
}