题目
题解
动态规划。
多重背包模板题。
转化成要放满承重为m的背包,所需的物品的最小价值为多少;每个物品的价值就是1,即1个,每种物品还有数量限制,套用多重背包模板即可。
代码1是二维实现,代码2是一维实现。
代码1
#include<bits/stdc++.h>
using namespace std;
const int N = 110, M = 2e4+10;
int dp[N][M], v, c;
int n, m;
int main()
{
cin>>m>>n;
memset(dp, 0x3f, sizeof dp); // 最小值就这样初始化
dp[0][0] = 0;
for(int i = 1;i <= n;i ++) {
cin>>v>>c;
for(int j = 0;j <= m;j ++)
for(int k = 0;k <= c && k*v <= j;k ++)
dp[i][j] = min(dp[i][j], dp[i-1][j-k*v] + k);
}
if(dp[n][m] < 0x3f3f3f3f) cout << dp[n][m] << endl;
else cout << "><" << endl;
}
代码2
#include<bits/stdc++.h>
using namespace std;
const int N = 110, M = 2e4+10;
int dp[M], v, c;
int n, m;
int main()
{
cin>>m>>n;
memset(dp, 0x3f, sizeof dp);
dp[0] = 0;
for(int i = 1;i <= n;i ++) {
cin>>v>>c;
for(int j = m;j >= v;j --)
for(int k = 1;k <= c && k*v <= j;k ++)
dp[j] = min(dp[j], dp[j-k*v] + k);
}
if(dp[m] < 0x3f3f3f3f) cout << dp[m] << endl;
else cout << "><" << endl;
}