基本思想:
这道题利用动态规划中的背包思想来解决时,是很方便和快捷的。
用如下测试用例来进行说明:
输入:
2
1 2
2 1
输出:
5
该测试用例的dp表如下图所示:
初始条件:
v[0] = 1; //表明砝码可以称重0g
代码如下:
#include <iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
int w[10]={0}; //对应砝码的重量
int num[10]={0}; //对应砝码的数量
for(int i=0;i<n;i++)
cin>>w[i]; //输入砝码重量
for(int i=0;i<n;i++)
cin>>num[i]; //输入砝码数量
int v[20000]={0};
int maxw=0;
for(int i=0;i<n;i++)
maxw+=num[i]*w[i]; //求出最大重量
v[0]=1;
//类似背包问题
for(int i=0;i<n;i++) //砝码类别
for(int j=maxw;j>=0;j--) //背包容量
for(int k=1;k<=num[i];k++){ //砝码数量
if(v[j]==1 && j+k*w[i]<=maxw)
v[j+k*w[i]]=1;
}
int res=0;
for(int i=0;i<=maxw;i++)
if(v[i]==1)
res++;
cout<<res<<endl;
}
return 0;
}
运行结果: