链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
你有一个背包,最多能容纳的体积是V。
现在有n种物品,每种物品有任意多个,第i种物品的体积为viv_ivi ,价值为wiw_iwi。
(1)求这个背包至多能装多大价值的物品?
(2)若背包恰好装满,求至多能装多大价值的物品?
输入描述:
第一行两个整数n和V,表示物品个数和背包体积。
接下来n行,每行两个数viv_ivi和wiw_iwi,表示第i种物品的体积和价值。
1≤n,V≤10001 \le n, V \le 10001≤n,V≤1000
输出描述:
输出有两行,第一行输出第一问的答案,第二行输出第二问的答案,如果无解请输出0。
输入:
2 6
5 10
3 1
输出:
10
2
答案:
#include<iostream>
#include<bits/stdc++.h>
#define N 1000
using namespace std;
int v[N];
int w[N];
int dp[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
memset(dp,-0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j>=v[i]){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
}
int max_my=0;
for(int i=1;i<=m;i++){
max_my=max(max_my,dp[i]);
}
cout<<max_my<<endl;
if(dp[m]>0) cout<<dp[m]<<endl;
else cout<<'0'<<endl;
return 0;
}
本题与01背包类似