2 solutions

  • 2
    @ 2024-3-22 13:25:58

    题意

    nn 个物品, mm 块钱。

    每个物品有一个重量(价值)ww,价值 vv,数量 ss

    思路

    本题和A1267. 【例9.11】01背包问题的思路差不多,只是物品变成多个了(多一个循环遍历数量)

    详见题解 - 【例9.11】01背包问题

    01 背包是背包的基础,这里的做法是在 01 背包的基础上增加数量遍历

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[6005],w[505],v[505],s[505];
    // a:第 i 个重量(价格)
    // w:第 i 个奖品的重量(价格)
    // v:第 i 个奖品的价值
    // s:第 i 个奖品的数量
    int main(int argc, char **argv){
    	int n,m;
    	cin >> n >> m;
    	for (int i = 1;i <= n;i++){
    		cin >> w[i] >> v[i] >> s[i];
    	}
    	for (int j = 1;j <= n;j++){
    		for (int i = m;i >= w[j];i--){
    			for (int k = 1;k <= s[j] && k * w[j] <= i;k++){	// 遍历这个奖品的数量,且总重量不能超过最大重量
    				a[i] = max(a[i - k * w[j]] + k * v[j],a[i]);	// 01 背包是只加一个,这里要加数量 * 价值
    			}
    		}
    	}
    	cout << a[m];
    	return 0;
    }
    

    广告

    Mօjang AB 开发的《你的mc打怪记》,是一个 mc 版的打怪小游戏,欢迎大家游玩。

    在末影龙统治的世界里,你要击败末影龙,拯救人类,成为新的统治者。

    点我进入《你的mc打怪记》主页

    • @ 2024-3-22 21:18:01

      广告???👀️

    • @ 2024-3-25 13:50:43

      广告?

      什么东西?

      还是这种都没有人玩的老游戏?

    • @ 2024-3-26 20:01:33

      只要黄*然做不出来的都是好游戏@

  • 1
    @ 2024-3-16 16:48:06
    #define ll long long
    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int v[100005],w[100005],s[100005];
    int vst[100005];
    //递推数组 
    int main(){
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) cin>>v[i]>>w[i]>>s[i];
    	for(int i=1;i<=n;i++) for(int j=m;j>=0;j--) for(int k=0;k<=s[i]&&!(j-k*v[i]<0);k++)
    		vst[j]=max(vst[j],vst[j-k*v[i]]+k*w[i]);
    	/*i:遍历数组v 
    	  j:反向遍历递推数组
    	  k:次数计时器
    	  在循环途中,若内存不足放入背包(j-k*v[i]<0) 
    	  退出当前次数计时
    	*/ 
    	cout<<vst[m]<<"\n";
    	//输出最后的visit 
    	return 0;
    }
    

    记忆搜索再起不能

    • 1

    Information

    ID
    754
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    # Submissions
    81
    Accepted
    29
    Uploaded By