题目描述
有n件物品,每件物品的重量为w。现在需要选出若干件物品放入一个容量为v的背包中(每件物品至多选一次),使得选入背包的物品重量之和恰好等于容量v。求满足条件的方案数。
输入描述
第一行两个整数n、v(1≤n≤100,1≤v≤10^3),分别表示物品数量、背包容量;
第二行为用空格隔开的n个整数w(1≤w≤10),表示物品重量。
输出描述
输出一个整数,表示方案数。由于结果可能很大,因此将结果对10007取模后输出。
输入样例
4 7 2 4 5 3
输出样例
2
代码:
#include<bits/stdc++.h>
using namespace std;
int dp[10005][10005],w[10005];
int main(){
int n,v;
cin>>n>>v;
for(int i = 1;i<=n;i++){
cin>>w[i];
}
memset(dp,0,sizeof(dp));
dp[0][0] = 1; //背包容量为0时,不放入也是一种方案
for(int i = 1;i<=n;i++){
for(int j = 0;j<=v;j++){
dp[i][j] = dp[i-1][j];
if(j>=w[i]){
dp[i][j] = (dp[i][j]+dp[i-1][j-w[i]])%10007;
}
}
}
cout<<dp[n][v];
}