有n个不同大小的数字a[i],每种m[i]个,是否存在若干个和恰为k p63
#include<cstdio>
int main()
{
int n,k;
int a[1000],m[1000];//值 个数
bool dp[1000+1][1000+1];
dp[0][0]=true;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);//数值
for(int i=0;i<n;i++)
scanf("%d",&m[i]); //每个数的个数
for(int i=0;i<n;i++)
{
for(int j=0;j<=k;j++)
{
for(int h=0;h<=m[i]&&h*a[i]<=j;h++){
dp[i+1][j]=dp[i][j-h*a[i]];
}
}
}
if(dp[n][k]) printf("Yes\n");
else printf("No\n");
return 0;
}
简化
#include<cstdio>
#include<algorithm>
using namespace std;
#include<cstring>
int main()
{
int n,k;
int a[1000],m[1000];//值 个数
int dp[1000];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);//数值
for(int i=0;i<n;i++)
scanf("%d",&m[i]); //每个数的个数
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(int i=0;i<n;i++){
for(int j=0;j<=k;j++){
if(dp[j]>=0)
dp[j]=m[i];
else if(j<a[i]||dp[j-a[i]]<=0)
dp[j]=-1;
else
dp[j]=dp[j-a[i]]-1;
}
}
if(dp[k]>=0) printf("Yes\n");
else printf("No\n");
return 0;
}