有1克、2克、3克、4克的砝碼各一枚,能稱出哪幾種重量?


暴力解

#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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM