U224067 背包问题求方案数
题目描述
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 v_i,价值是 w_i。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出 最优选法的方案数。注意答案可能很大,请输出答案模 10^9+7 的结果。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 v_i,w_i,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示 方案数 模 10^9+7 的结果。
输入输出样例 #1
输入 #1
4 5
1 2
2 4
3 4
4 6
输出 #1
2
说明/提示
0<N,V≤1000
0<v_i,w_i≤1000
我的代码:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
#define i_will signed
#define ak main
#define IMO ()
#define int long long
#define double long double
I AK IOI;
const int MOD=1e9+7;
int N,V,v[1005],w[1005],dp[1005],cnt[1005];
i_will ak IMO{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
memset(dp,-0x3f,sizeof dp);
memset(cnt,0,sizeof cnt);
cin>>N>>V;
for(int i=1;i<=N;i++)cin>>v[i]>>w[i];
dp[0]=0;
cnt[0]=1;
for(int i=1;i<=N;i++){
for(int j=V;j>=v[i];j--){
if(dp[j-v[i]]+w[i]>dp[j]){
dp[j]=dp[j-v[i]]+w[i];
cnt[j]=cnt[j-v[i]];
}
else if(dp[j-v[i]]+w[i]==dp[j])cnt[j]=(cnt[j]+cnt[j-v[i]])%MOD;
}
}
cout<<cnt[V]%MOD;
i_ak ioi;
}
一直都是 WA50。
至今第二失败的题目,第一失败的题目是之前被 P1000 刺杀。