题意:
给你数a[1],a[2]和t,让你求x个a[1]+y个a[2]能得到的最接近t的数。
思路:
完全背包题,t为背包最大受重,然后和01背包仅一个不同:01背包内部是逆序,它则为逆序。原因是:之前uva562http://blog.csdn.net/conatic/article/details/50927306
提到的不能用顺序的原因是怕小的硬币影响大的,这里背包可以重复拿,不存在影响问题,因而用顺序
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[3],dp[10005];
int main() {
int t;
while (~scanf("%d%d%d", &a[1], &a[2], &t)) {
memset(dp, -1, sizeof(dp));
dp[0] = 0;
for (int i = 1; i <= 2; i++) {
for (int j = a[i]; j <= t ; j++) {
if (dp[j-a[i]] != -1)
dp[j] = max(dp[j], dp[j - a[i]] + 1);
}
}
int i = t;
while (i >= 1) {
if (dp[i] != -1)
break;
i--;
}
printf("%d",dp[i]);
if (i != t)
printf(" %d", t - i);
printf("\n");
}
return 0;
}