説明タイトル-ラà小さな
uimのポケット要素M、Nのレストラン野菜、最初に の売りの種類 元( ≤1000)。それは、それぞれの野菜のように一つだけのコピーは非常にローエンドのレストランですので。ほとんど遵守彼はただ、一点uimのすべての彼女のお金の仕上げを置く必要がありますので「あきらめてはいけないお金を食べてはいけません」。彼はどのように多くのアラカルトアプローチを知りたいと思いました。
入力フォーマット
最初の行の2つの数であるN及びMを表します。
Nが正から第二列 (あなたは同じ番号を有していてもよく、それぞれが少ない10001000よります)。
出力フォーマットは、
順序付けスキームの数を表す正の整数、答えはint型の範囲内で保証されています。
サンプルA
。4. 4
。1 1 2 2
出力
3
ソリューション:0-1ナップザック問題
私は2次元の話をしてみましょう:
F [i] [j]の定義は、iが以前の状態遷移方程式は以下の通りであるコースの総数、ドルを使用する方法光jがあります。
(1)IF(J == i番目のコース価格)F [i]は[J] = F [I-1]〜[J] +1。
(もちろんjのI価格>)、(2)もし、F [i]は[J] = F [I-1]〜[J] + F [I-1] [J-I-皿価格]。
(3)(j <i番目のコース価格)F [i]は[J] = F [I-1]〜[J]であれば、
次いで、ナップザックの空間的な複雑さに基づいて、一次元配列の最適化に還元
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[101], f[10001] = {0};
int n, m;
cin >> n >> m;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
f[0] = 1;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=a[i];j--)
{
f[j] = f[j] + f[j-a[i]];
}
}
cout << f[m];
return 0;
}