题目链接: [Cut Ribbon]
大致题意:
给出一条丝带长度n,要求把丝带切成给定长度a,b,c中的一种或多种
最多能切成几条(保证至少有一个解)
解题思路:
目实质上就是问:刚好装满完全背包,可以装的最大数量为多少
dp[i]表示装满容量i时的最大数量
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int dp[5000];
int main(void)
{
int n, a[3];
cin >> n >> a[0] >> a[1] >> a[2];
memset(dp, -INF, sizeof dp);
dp[0] = 0;
for (int i = 0; i < 3; ++i) {
for (int j = a[i]; j <= n; ++j) {
dp[j] = max(dp[j], dp[j - a[i]] + 1);
}
}
cout << dp[n] << endl;
return 0;
}