Qさんは、X曲の長さAの歌とY曲の長さBの歌があります.

2096 ワード

QさんはX曲の長さがAの歌とY曲の長さがBの歌があります.
2つの解法を紹介します.解法1(自牛客網IDを参考に牛です.私は牛です.私は牛です.コード(筆者が書いた解析付き):
01リュックの問題と見なす
#include
using namespace std;
int B[201][1001]={0};   // B[i][j],       j,   1-i        
int w[201];   //w[i] : i       


int main(){
    int k,a,x,b,y,i,j;
   while(cin>>k){
        cin>>a>>x>>b>>y;
        for(i=0;i<=x+y;i++){
        	B[i][0]=1;  //B[i][0]  1,          0,   1   。
		}
        
        for(i=1;i<=x;i++){
            w[i]=a;
        }
        for(i=x+1;i<=x+y;i++ ){
            w[i]=b;
        }
        for(i=1;i<=x+y;i++){
            for(j=1;j<=k;j++){
        /*          >=  i    (   %1000000007)
				(  i        j      )=      (  i-1        j     )+     (  i-1        j-     p[i]     )
			  (                 )
				(  i        j      )=      (  i-1        j     ) */
                if(j>=w[i])
                    B[i][j]=(B[i-1][j-w[i]]%1000000007+B[i-1][j]%1000000007)%1000000007;
                else
                    B[i][j]=B[i-1][j];
            }
        }
        cout<

解法2:
組み合わせ数で、C[i][j]=C[i-1][j-1]+C[i-1][j]はi個の中からj個を取って先にi個のaを取ることを表し、(0 a)/b<=yであることを証明する.×c[y][(k-ia)/b]種.
(組合せ数の計算は牛客網IDから阿道:C(n,k)=C(n−1,k)+C(n−1,k−1);楊輝三角:1 1 1 1 1 1 2 1 3 1 4 4 4 1)データが大きいため、テーマで説明した%1億007を除いて、筆者はlong long intを使ったが、そうでないと溢れ出すデータがある.
#include
using namespace std;



int main(){
   int k,a,x,b,y,i,j;
    long long int count=0;
    long long int c[101][101];
   while(cin>>k){
   		cin>>a>>x>>b>>y;
   		c[0][0]=1;
   		for(i=1;i<=100;i++){
   			c[i][0]=1;
   			for(j=1;j<=100;j++){
   				c[i][j]=(c[i-1][j-1]+c[i-1][j])%1000000007;
			   }
		}
   		
   		
   		for(i=0;i<=k/a&&i<=x;i++){
   			if((k-i*a)%b==0&&(k-i*a)/b<=y)
   				count=(count+(c[x][i]*c[y][(k-i*a)/b])%1000000007)%1000000007;
            
		}
   		cout<

//以上の2つの方法はすべて牛客網のテストを通じて//本文章は筆者のオリジナルで、自分の学習過程を記録して分かち合って、転載して出典を明記してください