1797: 【基础】多重背包(1)
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:7
解决:3
题目描述
有N种物品和一个容量是V的背包。
第i种物品最多有si件,每件体积是vi,价值是wi。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。
第i种物品最多有si件,每件体积是vi,价值是wi。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。
输入
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。
0<N,V≤100
0<vi,wi,si≤100
输出
输出一个整数,代表最大价值。
样例输入 复制
4 10
3 2 2
4 3 2
2 2 1
5 3 4
样例输出 复制
8
提示
#include<bits/stdc++.h> using namespace std; int n,c; int v[10010],w[10010]; int dp[110]; int vi,wi,si,k; int main(){ cin>>n>>c; for(int i=1;i<=n;i++) { cin>>vi>>wi>>si; for(int j=1;j<=si;j++) { k++; v[k]=vi; w[k]=wi; } } for(int i=1;i<=k;i++) { for(int j=c;j>=v[i];j--) { dp[j]=max(dp[j],dp[j-v[i]]+w[i]); } } cout<<dp[c]; return 0; }
#include<bits/stdc++.h> using namespace std; int n,c; int v[110],w[110],s[110]; int dp[110]; int main(){ cin>>n>>c; for(int i=1;i<=n;i++) { cin>>v[i]>>w[i]>>s[i]; } for(int i=1;i<=n;i++) { for(int k=1;k<=s[i];k++){ for(int j=c;j>=v[i];j--) { dp[j]=max(dp[j],dp[j-v[i]]+w[i]); } } } cout<<dp[c]; return 0; }