我的代码 dfs
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_W=10500;
bool dp[MAX_W];
void dfs(int i,int n,int weight[],int nums[],int sum){
if(i==n) return;
for(int k=0;k<=nums[i];k++){
dp[sum+k*weight[i]]=true;
dfs(i+1,n,weight,nums,sum+k*weight[i]);
}
}
int fama(int n, int weight[], int nums[]){
memset(dp,0,sizeof(dp));
dp[0]=true;
dfs(0,n,weight,nums,0);
int cnt=0;
for(int i=0;i<MAX_W;i++)
if(dp[i]) cnt++;
return cnt;
}
int main(){
int n;
scanf("%d",&n);
int *w=new int [n];
int *num=new int [n];
for(int i=0;i<n;i++)
scanf("%d",w+i);
for(int i=0;i<n;i++)
scanf("%d",num+i);
int ans=fama(n, w, num);
printf("%d\n",ans);
delete []w;
delete []num;
return 0;
}
别人家的代码dp 引用链接 http://blog.csdn.net/a342500329a/article/details/32206053
#include <iostream>
#include <cstdio>
using namespace std;
int x[99],m[99],f[99999];
int main()
{
int n,i,j,k,M=0;
cin>>n;
for(i=1;i<=n;i++)
scanf("%d",&m[i]);
for(i=1;i<=n;i++)
scanf("%d",&x[i]);
for(i=1;i<=n;i++)
M+=m[i]*x[i];
f[0]=1;
for(i=1;i<=n;i++)
for(j=M;j>=0;j--)
for(k=1;k<=x[i];k++)
{
f[j]=f[j]|f[j-k*m[i]];
}
int num=0;
for(i=0;i<=M;i++)
if(f[i])num++;
cout<<num<<endl;
return 0;
}
还是有点 差距的 别人家的代码还是简洁一点
最基本的dp不会因为递推深度过深而溢出