DP +バックパックリニア思考[USACO09MAR]牛フリスビーチームS(ロス・バレーP2946)

[USACO09MAR]牛フリスビーチームS

タイトル説明

ファーマードンがフリスビーを取り上げた後、ファーマージョンは楽しみに参加したかったです。彼は、便利な1番自分のN牛からフリスビーチーム(1 <= N <= 2000)... Nを形成したいと考えています。牛は周りにディスクを裏返し練習し、各牛私は評価R_iと(1 <= R_iと<=10万)フリスビーを演奏し、彼女のスキルを示すがありますされています。FJは、彼の牛の一つ以上を選択することで、チームを形成することができます。

FJはフリスビーチームを形成する際に非常に選択する必要があるためしかし、彼は追加の制約を追加しました。彼のお気に入りの数はF(1 <= F <=千)であるので、チーム内の各牛の評価の合計がF.割り切れるであれば、彼は唯一のチームを受け入れます

ヘルプFJは、彼が選択することができますどのように多くの異なるチームを見つけます。この数が非常に大きくなる可能性があるので、出力は答えが億を法。

注:テストデータの約50%は、N <= 19を有するであろう。

フリスビーを演奏した後に開始する予定デイトンの農家は、ジョンはまた、牛がフリスビーを楽しむために計画しています。彼は、牛のフリスビーを設定したいです

チーム。彼N(1≤N≤2000)牛、各ユニットは、標準的なフリスビー指数はRI(1≤Ri≤100000)を有しています。ジョンは1を選出したり、複数の牛が彼のフリスビーチームに来ました。ジョンの幸運な数のF(1≤F≤1000)であるので、彼はすべての牛フリスビーレベル索引と幸運の数字の倍数であることを望みました。

ヘルプへのジョンは、どのように多くのチームアプローチの合計を計算します。

入力形式

  • 1行目:二スペースで区切られた整数:NとF

  • ライン2 ... N + 1:R_iと:行I + 1は、単一の整数が含まれています

出力フォーマット

  • 1行目:FJが選択できるチームの数、剰余億を表す単一の整数。

あなたはバックパックだけ一次元テンプレートをカバーする場合は、この質問は、バックパックの思考には反映されません。

DP [i] [j]は種類の数からなるフロントI jのデジタル数を示します。

伝達方程式は明らかです。

  1. あなたは、i番目、DPを取らない場合は、[I] [J] + = DP [I-1] [J]
  2. あなたは、i番目を取る場合は、DP [I] [J] + = DP [I-1] [JA [I]]

あなたは01リュックサック思ったことはありませんか?

違い、最初のモジュロ問題がある、最初の番号[i]の剰余収益を入力してくださいしかし、裸の質問でこの問題は、ボリュームは0からF-1にjの範囲になります。

一般的に、ときに、F 1は、その後、一般にゼロからDP [0] [0]、及びjは初期化され、これは全てのDPのために事前に明らかに不要である[I] [I]は初期化され、そしてすることができません初期DP [0] [0]。

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=2010;
const int M=2000100;
const LL mod=1e8;
int a[N];
LL dp[N][N];
int main(){
	int n,f;
	cin>>n>>f;
	for(int i=1;i<=n;i++) cin>>a[i],a[i]%=f; 
	for(int i=1;i<=n;i++) dp[i][a[i]]=1;//必须先赋初值,所以dp[0][0]就不要了 
	for(int i=1;i<=n;i++){
		for(int j=0;j<f;j++){//这个相当于从1开始遍历,所以之前要赋初值 
			(dp[i][j]+=dp[i-1][j]+dp[i-1][(j-a[i]+f)%f])%=mod;
		}
	}
	cout<<dp[n][0]<<endl;
	return 0;
}
公開された264元の記事 ウォン称賛46 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_44291254/article/details/105278398