题目:
有n种砝码的结果,可从小规模问题开始考虑
1.只有1种砝码,重量a:
那只需要根据该种砝码的个数进行计算,就能得到所需数量f(1) = a * k1;
2.有2种砝码,重量为a,b:
砝码a有k1个,砝码b有k2种个,因此,f(2) = presum + b*m, 其中presum < a*k1, m < k2。
从上式可以看出,这里应该存在两重循环,一是对之前结果presum的遍历,取之前存在的组合值;二是对新增砝码的遍历,找到新的f。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
int fama(int n, int weight[], int nums[]){
int maxWeight = 0;
//计算最大可能取到的重量,分配标记空间
for(int i = 0; i < n; i++)
maxWeight += weight[i] * nums[i];
vector<bool> flag(maxWeight + 1,false);
flag[0] = true;
int cnt = 1;
int sum = 0;
int preSum = 0;
for(int i = 0; i < n; i++){
for(int j = 1; j <= nums[i]; j++){
for(int k = 0; k <= preSum; k++){
if(flag[k]){
sum = k + weight[i] * j;
if(!flag[sum]){
flag[sum] = true;
cnt++;
}
}
}
}
preSum = sum;
}
return cnt;
}
void main(){
int n;
cin >> n;
int* weight = new int[n];
int* nums = new int[n];
for(int i = 0; i < n; i++)
cin >> weight[i];
for(int i = 0; i < n; i++)
cin >> nums[i];
int cnt = fama(n,weight,nums);
cout << cnt;
delete[] weight;
delete[] nums;
}