一、求最优方案总数
//二维数组的最优方案
#include<bits/stdc++.h>
int f[105][105],g[105][105];
int w[105],v[105];
int main(void)
{
int n,i,m,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);//输入数据
memset(g,1,sizeof(g)); //初始化为1,至少1种方案
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
//继承前面的状态
f[i][j]=f[i-1][j];
g[i][j]=g[i-1][j];
if(j>=w[i]) //可以变换
{
if(f[i][j]<f[i-1][j-w[i]]+1) //得到更大的解
{
f[i][j]=f[i-1][j-w[i]]+1; //更新最大值
g[i][j]=g[i-1][j-w[i]]; //继承前面的最大值
}
else if(f[i][j]==f[i-1][j-w[i]]+1) //有与前面相同值的解
g[i][j]=g[i-1][j-w[i]]+g[i-1][j]; //更新次数
}
}
}
//输出结果
printf("%d\n",g[n][m]);
return 0;
}
//一维数组
#include<bits/stdc++.h>
using namespace std;
int f[105],g[105],w[105];
int main(void)
{
int n,i,j,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&w[i]);
memset(f,0,sizeof(f));
memset(g,1,sizeof(g));
for(i=1;i<=n;i++)
{
for(j=m;j>=w[i];j--)
{
if(f[j]<f[j-w[i]]+1)
{
f[j]=f[j-w[i]]+1;
g[j]=g[j-w[i]];
}
else if(f[j]==f[j-w[i]]+1)
{
g[j]=g[j]+g[j-w[i]];
}
}
}
printf("%d\n",g[m]);
return 0;
}