萌新刚入OI被水题吊打

U224067 背包问题求方案数

题目描述

N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

i 件物品的体积是 v_i,价值是 w_i

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出 最优选法的方案数。注意答案可能很大,请输出答案模 10^9+7 的结果。

输入格式

第一行两个整数,NV,用空格隔开,分别表示物品数量和背包容积。

接下来有 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

U224067 背包问题求方案数 - 洛谷

我的代码:

#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 刺杀。

2 个赞

有人吗 qwq

1 个赞

@2345安全卫士 明明在线却不帮忙/dk

2 个赞

帮忙了,在找

1 个赞

解决了

2 个赞