描述 | |
---|---|
知识点 | 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | int n:n表示有多少组重量不同的砝码,1<=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<> int[] weight:表示n组砝码的重量,1<=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<> int[] num:表示n组砝码的最大数量,1<=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<> |
输出 | 利用给定的砝码可以称出的不同的重量数 |
样例输入 | 2 1 2 2 1 |
样例输出 | 5 |
#include<iostream>
#include<cmath>
#include<set>
using namespace std;
int main()
{
set<int>result;
int kind,toallnum=0,*pos,temp,sum=0;
cin>>kind;
int *weigth=new int[kind+1];
int *num=new int[kind+1];
for(int i=0;i<kind;i++)cin>>weigth[i];
for(int i=0;i<kind;i++)cin>>num[i];
for(int i=0;i<kind;i++)toallnum+=num[i];
int *fama=new int[toallnum+1];
pos=fama;
for (int i=0;i<kind;i++)
{
for (int j=1;j<=num[i];j++)
{
*pos++=weigth[i];
}
}
*pos=0;
for (int i=0;i<(int)pow((double)2,(double)toallnum);i++)
{
temp=i;
for (int j=0;j<toallnum;j++)
{
if(temp&0x00000001)
{
sum+=fama[j];
}
temp=temp>>1;
}
result.insert(sum);
sum=0;
}
cout<<result.size()<<endl;
return 0;
}