# 題目描述
有一組砝碼,重量互不相等,分別為m1、m2、m3……mn;它們可取的最大數量分別為x1、x2、x3……xn。?
現要用這些砝碼去稱物體的重量,問能稱出多少種不同的重量。?
Input
測試數據第一行一個整數n(n<=10),表示有多種不同的砝碼;?
第二行n個整數(中間用空格分隔),m1、m2、m3……mn,分別表示n個砝碼的重量;(1<=mi<=20)?
第三行n個整數(中間用空格分隔),x1、x2、x3……xn,分別表示n個砝碼可取的最大數量。(1<=xi<=20)?
Output
每組數據輸出僅一行,一個整數,表示利用給定的砝碼可以稱出的不同的重量數。?
注:包括0。?
Sample Input
2
1 2
2 1
Sample Output
5
~~~
//稱砝碼
int main() {
int n;
cin >> n;
int max_wight = 0;
vector<int> nums(n), wights(n);
for (int i = 0; i < n; i++)
cin >> wights[i];
for (int i = 0; i < n; i++) {
cin >> nums[i];
max_wight += wights[i] * nums[i]; //求最大可稱重的值
}
//set內是可以稱重的值,元素互斥單調增
set<int> s;
s.insert(max_wight);
//進行n次循環;
//對于第i次循環,將set中元素從小到大依次取出,
//減去k * wights[i],表示少使用k個質量為wights[i]的砝碼
//也可以作為可稱重的值;只要這個值是大于0的即可。
for (int i = 0; i < n; i++) {
set<int>::iterator iter = s.begin();
while (iter != s.end()) {
for (int k = 1; k <= nums[i] && *iter - k * wights[i] > 0; k++)
s.insert(*iter - k * wights[i]);
iter++;
}
}
s.insert(0);
cout << s.size() << endl;
return 0;
}
~~~
- 前言
- Josephus約瑟夫問題及其變種
- 鏈表的常見實現
- 二叉樹遍歷、插入、刪除等常見操作
- 二叉堆的插入刪除等操作C++實現
- 插入排序和希爾排序
- 堆排序
- 歸并排序及其空間復雜度的思考
- 快速排序的幾種常見實現及其性能對比
- 紅黑樹操作及實現
- 整數的二進制表示中1的個數
- 位操作實現加減乘除四則運算
- 冒泡排序的改進
- 直接選擇排序
- 不借助變量交換兩個數
- 基礎排序算法總結
- AVL樹(Adelson-Velskii-Landis tree)
- avl樹的C++實現
- 動態規劃之鋼條分割
- hash函數的基本知識
- 動態規劃:求最長公共子串/最長公共子序列
- 最長遞增子序列
- 稱砝碼問題
- 汽水瓶
- 字符串合并處理(二進制位的倒序)
- 動態規劃:計算字符串相似度
- m個蘋果放入n個盤子
- 生成k個小于n的互不相同的隨機數
- 棧和隊列的相互模擬
- 字符串的排列/組合
- KMP(Knuth-Morris-Pratt)算法
- n個骰子的點數
- 位運算的常見操作和題目