暴力解
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int n; int a[100], vis[10000];//vis數組用來判斷稱過的重量是否出現過 cin >> n; for (int i = 0; i<n; i++) { scanf("%d", &a[i]); } memset(vis, 0, sizeof(vis)); int cnt = 0; for (int i = 1; i <= n; i++)//控制使用砝碼的數量 { for (int j = 0; j<n; j++)//控制取到的第一個砝碼 { int sum = 0; for (int k = j; (k<(j + i))&&k<n; k++)//控制取砝碼的區間長度 { sum = sum + a[k]; if (vis[sum] == 0) { vis[a[k]] = 1; cnt++; } } } } cout << cnt+1 << endl;//最后要加上稱的總重量為0的情況 return 0; }
母函數解
https://blog.csdn.net/valieli/article/details/53049939
//計算(1+x)*(1+x^2)*(1+x^3)*(1+x^4) #include <iostream> using namespace std; #define maxn 20 //數組的大小 int c1[maxn],c2[maxn];//c2為臨時存儲數組 int main() { int m; for(int i=0;i<maxn;i++) //初始化第一個式子:(1+x^2+x^3+...) { c1[i]=1; c2[i]=0; } //以下兩個循環的表示過程就是1*(1+x) //(1+x^1)(1+x^2) //(1+x^1+x^2)*(1+x^3) //(1+x^1+x^2+x^3)*(1+x^4) //(1+x^1+x^2……x^j)(1+x^i) //被乘數*乘數 //k表示被乘數中的每一項 for(int i=2;i<=4;i++) // i 從第二個式子循環到第四個。 {//(1+x)*(1+x^2)*(1+x^3)*(1+x^4)因為(1+x)的系數和指數已經初始化,所以將(1+x)作為乘數,(1+x^2)、(1+x^3)、(1+x^4)依次作為被乘數 for(int j=0;j<=0.5*i*(i-1);j++) // j 從0循環到它所在式子中的指數最大值,即(1+x^1+x^2+……x^j) { for(int k=0,t=0;t<=1;t++,k+=i) //本例子中 k 表示指數增量,t 表示 k 增加幾次。本式子中k增加1次 { c2[k+j]+=c1[j]; } } for(int j=0;j<maxn;j++) //更新數組 { c1[j]=c2[j]; c2[j]=0; } } int sum=0; for(int i=0;i<maxn;i++) sum=sum+c1[i]; cout<<sum<<endl; return 0; }
#include <iostream> #include <cstring> using namespace std; #define min(a,b) ((a)<(b)?(a):(b)) int T, N, K, n[8], v[8], a[42], b[42], i, j, k, last, last2;//用一個last變量記錄目前最大的指數 int main() { cin >> K >> N; for (i = 0; i<K; i++) cin >> v[i] >> n[i];//v[i]是存儲不同課程的學分值,n[i]是儲存每個學分對幾個課程(每個學分可以使用的次數) a[0] = 1; last = 0; for (i = 0; i<K; i++) { last2 = min(last + n[i] * v[i], N);//計算下一個last memset(b, 0, sizeof(int)*(last2 + 1)); for (j = 0; j <= n[i] && j*v[i] <= last2; j++) for (k = 0; k <= last && k + j * v[i] <= last2; k++) b[k + j * v[i]] += a[k]; memcpy(a, b, sizeof(int)*(last2 + 1)); last = last2; } int sum = 0; for (int i = 0; i <= N; i++) sum = sum + a[i]; cout << sum << endl; return 0; }