题目描述
有n件物品,每件物品的重量为w,价值为c。现在需要选出若干件物品放入一个容量为V的背包中(每件物品至多选一次),使得在选入背包的物品重量之和不超过容量V的前提下,让背包中物品的价值之和最大,求最大价值与对应的最优方案数。
输入描述
第一行两个整数n、V(1≤n≤100,1≤V≤10^3),分别表示物品数量、背包容量;
第二行为用空格隔开的n个整数w(1≤w≤100),表示物品重量;
第三行为用空格隔开的n个整数c(1≤c≤100),表示物品价值。
输出描述
输出两个整数,分别表示最大价值与最优方案数,中间用空格隔开。由于结果可能很大,因此将结果对10007取模后输出。
输入样例
3 5
1 2 5
4 2 6
输出样例
6 2
代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005],cnt[1005][1005],w[1005],c[1005];
int main(){
int n,v;
cin>>n>>v;
for(int i = 1;i<=n;i++){
cin>>w[i];
}
for(int i = 1;i<=n;i++){
cin>>c[i];
}
memset(dp,0,sizeof(dp));
for(int i = 0;i<=v;i++){
cnt[0][i] = 1;
}
for(int i = 1;i<=n;i++){
for(int j = 0;j<=v;j++){
if(j>=w[i]){
dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);
if(dp[i][j]==dp[i-1][j]){
cnt[i][j] = cnt[i-1][j];
}
if(dp[i][j]==dp[i-1][j-w[i]]+c[i]){
cnt[i][j] = (cnt[i][j]+cnt[i-1][j-w[i]])%10007;
}
}else{
dp[i][j] = dp[i-1][j];
cnt[i][j] = cnt[i-1][j];
}
}
}
cout<<dp[n][v]<<" "<<cnt[n][v];
}