1 solutions

  • 0
    @ 2025-3-3 16:21:27

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    int n,m;
    //体积恰好是j的情况,表示体积要用完 
    int f[1010];//记录体积恰好是j的情况下的最大价值 
    int g[1010];//记录体积恰好是j的情况下的方案数
    int mod = 1000000000 + 7;
    int INF = 1000000;
    int v,w;
    int t,s;
    
    int main(){
    	cin>>n>>m;
    	//背包什么都不装也是一种方案 
    	for(int i = 0;i <= m;i++) g[i] = 1;
    	//循环物品数 
    	for(int i = 1;i <= n;i++){
    		cin>>v>>w;
    		//01背包循环背包容量~当前物品的体积 
    		for(int j = m;j >= v;j--){
    			t = max(f[j],f[j-v]+w);//选和不选的最大价值
    			//判断从哪个决策转移过来的
    			s = 0;
    			//两个决策如果都是最优的,那么方案是就是两者之和 
    			if(t == f[j]) s = (s+g[j])%mod;//没选是最优的 
    			if(t == f[j-v] + w) s = (s+g[j-v])%mod;//选了是最优的 
    			f[j] = t;
    			g[j] = s;
    		}
    	} 
    	
    	cout<<g[m];
    	return 0;
    }
    
    
    • 1

    Information

    ID
    9953
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By