#include<stdio.h>
#include<string.h>
struct node
{
int x;
int y;
}a[110];
int dp[110][1100];
int max(int x,int y)
{
if(x>y) return x;
return y;
}
int min(int x,int y)
{
if(x<y) return x;
return y;
}
int main()
{
int n,m,i,sum,j,aa,bb,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=0;
memset(dp,-1,sizeof(dp));
dp[0][0]=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
sum=sum+a[i].x;
}
scanf("%d%d",&aa,&bb);
for(i=1;i<=n;i++)
{
for(k=min(i,m);k>=1;k--) //注意顺序 ,逆序 表示每件只取一件, 顺序 表示可取多件
//for(k=1;k<=min(i,m);k++)
for(j=sum;j>=a[i].x;j--)
{
if(dp[k-1][j-a[i].x]!=-1)
dp[k][j]=max(dp[k][j],dp[k-1][j-a[i].x]+a[i].y); // dp[k][j]
//dp[k][j]=max(dp[k][j],dp[k-1][j-a[i].x]+a[i].y);
}
}
/*
printf("%d************\n",sum);
for(i=0;i<=n;i++)
{
for(j=0;j<=sum;j++)
printf("(%d,%d)%d ",i,j,dp[i][j]);
printf("\n");
}
*/
int max=-1;
for(i=aa;i<=sum;i++)
{
if(dp[m][i]>=bb)
{
if((i+dp[m][i]-aa-bb)>max)
max=(i+dp[m][i]-aa-bb);
// printf("(%d,%d)%d ",m,i,dp[m][i]);
}
// printf("\n");
}
//if(max==-1)
printf("%d\n",max);
}
return 0;
}
/*
3 2
1 10
3 2
3 4
5 3
*/
买糖果 fzu 2116(自己基础不牢固,谢谢大神的指点)
最新推荐文章于 2023-04-01 21:00:00 发布