#include <bits/stdc++.h>
using namespace std;
int w[101],c[101],v,n,num[101],m = 10,f[101];//v背包容量,n物品数量。v<=200,n<=30 。
//W:重量 ,C:价值,num此物品可购买的最多件数 ,m背包总容量
void ZeroOnePack(int cost , int weight){
for(int v = m; v >= weight; v--){
f[v] = max( f[v] , f[v-weight] + cost);
}
}
void CampletePack(int cost, int weight){
for(int v = weight; v <= m; v++){//和01背包一样从大到小也可以
f[v] = max( f[v] , f[v - weight] + cost);
}
}
void MultiplePack(int cost, int weight , int num){
for(int j = m; j >= 1; j--){
for(int k = 1; k <= num; k++){
if( j - k * weight >= 0){
f[j] = max( f[j] , f[j - k * weight] + k * cost);
}
}
}
}
int main(){
cin >> v >> n;
for(int i = 1; i <= n; i++){
cin >> w[i] >> c[i] >> num[i];
}
for(int i = 1; i <= n; i++){
if(num[i] == 1){
ZeroOnePack(c[i] , w[i]);
}else if(num[i] == 0){
CampletePack(c[i] , w[i]);
}else{
MultiplePack(c[i] , w[i] , num[i]);
}
}
cout << f[m] << endl;
return 0;
}
输入:
10 3
2 1 0
3 3 1
4 5 4
输出:11