背包问题的变种。保证费时尽量多的情况下,数目尽可能多。但是不能反过来进行。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
int w[5],v;
while(scanf("%d%d%d",&w[0],&w[1],&v)!=EOF)
{
int dp1[11000],dp2[11000];
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
for(int i=0;i<2;i++)
for(int j=w[i];j<=v;j++)
{
if(dp1[j]<dp1[j-w[i]]+w[i])
{
dp1[j]=dp1[j-w[i]]+w[i];
dp2[j]=dp2[j-w[i]]+1;
}
else if(dp1[j]==dp1[j-w[i]]+w[i])
dp2[j]=max(dp2[j],dp2[j-w[i]]+1);
}
printf("%d",dp2[v]);
if(dp1[v]!=v)
printf(" %d",v-dp1[v]);
printf("\n");
}
return 0;
}