codeforces 106C
题意:
给
定
n
克
面
粉
,
m
种
馅
料
,
第
i
种
馅
料
有
a
i
克
,
使
用
第
i
种
馅
料
制
作
价
值
v
i
的
面
包
消
耗
b
i
克
馅
料
和
w
i
克
面
粉
。
给定n克面粉,m种馅料,第i种馅料有a_i克,使用第i种馅料制作价值v_i的面包消耗b_i克馅料和w_i克面粉。
给定n克面粉,m种馅料,第i种馅料有ai克,使用第i种馅料制作价值vi的面包消耗bi克馅料和wi克面粉。
给
定
c
和
d
,
你
可
以
单
独
用
c
克
面
粉
制
作
价
值
为
d
的
面
包
。
给定c和d,你可以单独用c克面粉制作价值为d的面包。
给定c和d,你可以单独用c克面粉制作价值为d的面包。
问
最
大
收
益
。
问最大收益。
问最大收益。
题解:
n
u
m
[
i
]
表
示
第
i
种
馅
料
的
数
量
,
将
问
题
转
化
为
多
重
背
包
。
num[i]表示第i种馅料的数量,将问题转化为多重背包。
num[i]表示第i种馅料的数量,将问题转化为多重背包。
d
p
[
j
]
表
示
说
利
用
n
克
面
粉
制
作
出
面
包
的
最
大
收
益
。
dp[j]表示说利用n克面粉制作出面包的最大收益。
dp[j]表示说利用n克面粉制作出面包的最大收益。
- d p [ j ] = m a x ( d p [ j ] , d p [ j − k ∗ w [ i ] ] + k ∗ v [ i ] ) dp[j] = max(dp[j], dp[j-k*w[i]]+k*v[i]) dp[j]=max(dp[j],dp[j−k∗w[i]]+k∗v[i])
#include <bits\stdc++.h>
using namespace std;
const int N = 1001;
int w[11], v[11], num[11];
int dp[N];
int main() {
int n, m, a, b;
cin >> n >> m >> w[m] >> v[m];
num[m] = n/w[m];
for(int i = 0 ; i < m ; i++){
cin >> a >> b >> w[i] >> v[i];
num[i] = a/b;
}
for(int i = 0 ; i <= m ; i++){
for(int j = n ; j >= w[i] ; j--){
for(int k = 0 ; k <= min(num[i], j/w[i]) ; k++){
dp[j] = max(dp[j], dp[j-k*w[i]]+k*v[i]);
}
}
}
cout << dp[n] << endl;
return 0;
}