本题遍历的话很好理解,动态规划主要就是要理解dp数组中要有最大重量个元素,通过dp[weight-weight[i]]->dp[weight],如果前一个可以由砝码组成一个重量的话后一个也可以,下面看代码,代码有注释。
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int kinds;
while(cin>>kinds){
vector<int> weight(kinds,0);
vector<int> quantity(kinds,0);
int maxweight=1;
for(int i = 0;i<kinds;i++){
int temp;
cin>>temp;
weight[i]=temp;
}//每个种类的重量
for(int j = 0;j<kinds;j++){
int temp;
cin>>temp;
quantity[j]=temp;
}
for(int m = 0 ;m<kinds;m++){
maxweight+=weight[m]*quantity[m];
}
vector<bool> dp(maxweight,false);
dp[0]=true;
for(int i = 0 ;i<kinds;i++){
for(int j = 0;j<quantity[i];j++){//因为一种重量可能有多个,
//这里判断是不是累加起来的重量
//也可以组成不同的重量
for(int k=maxweight;k>=weight[i];k--){//这里的循环是为了统计同一重量
//经过累加后到底可以组成多少重量承接上一个for循环,
//dp中的元素值为1代表有组合可以组成这个重量
if(dp[k-weight[i]])
dp[k]=true;
}//for3
}//for2
}//for1
int cnt = 0;
for( int i =0;i<maxweight;i++){
if(dp[i]) cnt++;
}
cout<<cnt;
}
}