题目描述
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),
输入输出格式
输入格式:输入方式:a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
输出格式:输出方式:Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
输入输出样例
输入样例#1:
1 1 0 0 0 0
输出样例#1:
Total=3
应该是01背包问题,
但是暴力居然过了!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 void read(int & n) 7 { 8 char c='+';int x=0;int flag=0; 9 while(c<'0'||c>'9') 10 { 11 c=getchar(); 12 if(c=='-') 13 flag=1; 14 } 15 while(c>='0'&&c<='9') 16 x=x*10+(c-48),c=getchar(); 17 flag==1?n=-x:n=x; 18 } 19 const int MAXN=100001; 20 int maxt,n; 21 int dp[MAXN]; 22 int a[10]; 23 int num=0; 24 int ans=0; 25 int vis[1000001]; 26 int main() 27 { 28 for(int i=1;i<=6;i++) 29 { 30 read(a[i]); 31 } 32 for(int i1=0;i1<=a[1];i1++) 33 for(int i2=0;i2<=a[2];i2++) 34 for(int i3=0;i3<=a[3];i3++) 35 for(int i4=0;i4<=a[4];i4++) 36 for(int i5=0;i5<=a[5];i5++) 37 for(int i6=0;i6<=a[6];i6++) 38 { 39 int p=i1+2*i2+3*i3+5*i4+10*i5+20*i6; 40 if(vis[p]==0&&p!=0) 41 { 42 vis[p]=1; 43 ans++; 44 } 45 } 46 printf("Total=%d",ans); 47 return 0; 48 }