01背包问题的最优方案数

题目描述

有n件物品,每件物品的重量为w,价值为c。现在需要选出若干件物品放入一个容量为V的背包中(每件物品至多选一次),使得在选入背包的物品重量之和不超过容量V的前提下,让背包中物品的价值之和最大,求最大价值与对应的最优方案数。

输入描述

第一行两个整数n​、V(1≤n≤100,1≤V≤10^3​),分别表示物品数量、背包容量;

第二行为用空格隔开的n​个整数w(1≤w≤100​),表示物品重量;

第三行为用空格隔开的n​个整数c(1≤c≤100​),表示物品价值。

输出描述

输出两个整数,分别表示最大价值与最优方案数,中间用空格隔开。由于结果可能很大,因此将结果对10007取模后输出。

输入样例

复制代码
3 5 
1 2 5 
4 2 6

输出样例

复制代码
6 2

代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005],cnt[1005][1005],w[1005],c[1005];
int main(){
	int n,v;
	cin>>n>>v;
	for(int i = 1;i<=n;i++){
		cin>>w[i];
	}
	for(int i = 1;i<=n;i++){
		cin>>c[i];
	}
	memset(dp,0,sizeof(dp));
	for(int i = 0;i<=v;i++){
		cnt[0][i] = 1;
	}
	for(int i = 1;i<=n;i++){
		for(int j = 0;j<=v;j++){
			if(j>=w[i]){
				dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);
				if(dp[i][j]==dp[i-1][j]){
					cnt[i][j] = cnt[i-1][j];
				}
				if(dp[i][j]==dp[i-1][j-w[i]]+c[i]){
					cnt[i][j] = (cnt[i][j]+cnt[i-1][j-w[i]])%10007;
				}
			}else{
				dp[i][j] = dp[i-1][j];
				cnt[i][j] = cnt[i-1][j];
			}
		}
	}
	cout<<dp[n][v]<<" "<<cnt[n][v];
}
相关推荐
用户979984807185 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks5 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea5 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术5 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术6 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户0441440924496 小时前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠6 小时前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术6 小时前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考6 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法
罗西的思考6 小时前
机器人 / 物理 Agent Harness 综合分析与对比:从「更强的模型」到「更好的系统」
人工智能·算法·机器学习