#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int mx = 10001;
int c1[mx], c2[mx];
/// c1是保存各项质量砝码可以组合的数目/// c2是中间量,保存每一次的情况
int main()
{
int nm;
int i, j, k;
while(cin >> nm){
for( i = 0 ; i <= nm ; i ++ ){
c1[i] = 1;
c2[i] = 0;
}
for( i = 2 ; i <= nm ; i ++ ){
for( j = 0 ; j <= nm ; j ++ ){
for( k = 0 ; k+j <= nm ; k += i ){
c2[j+k] += c1[j];//cout<<c2[j+k]<<" "<<c1[j]<<endl;
}
}
for( j = 0 ; j <= nm ; j ++ ){
///把c2的值赋给c1,而把c2初始化为0,因为c2每次是从一个表达式中开始的
c1[j] = c2[j];
c2[j] = 0;
}
}
cout << c1[nm] << endl;
}
return 0;
}
(下面的应该有些脱离多项式乘法了,但是是我的理解,觉得错误的可以指出来, 也可以直接跳过吧)
我感觉吧,开的三重循环的意思是最外层循环是每次添加从2开始的数,第二层循环为在第几个位置添加那些数,最里面那个循环是添加多少个i这个数进去。这样循环之后就会有很多种情况产生,记录次数。打个表应该容易理解。