羅区P1164 - 小さなアラカルト

説明タイトル-ラà小さな
uimのポケット要素M、Nのレストラン野菜、最初に の売りの種類 a i a_iを 元( a i a_iを ≤1000)。それは、それぞれの野菜のように一つだけのコピーは非常にローエンドのレストランですので。ほとんど遵守彼はただ、一点uimのすべての彼女のお金の仕上げを置く必要がありますので「あきらめてはいけないお金を食べてはいけません」。彼はどのように多くのアラカルトアプローチを知りたいと思いました。
入力フォーマット
最初の行の2つの数であるN及びMを表します。
Nが正から第二列 a i a_iを (あなたは同じ番号を有していてもよく、それぞれが少ない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;
}
公開された152元の記事 ウォン称賛22 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_38204302/article/details/105186697