时间限制:2.0s 内存限制:16.0MB Special Judge 代码提交间隔:5分钟(现在可以提交)
问题描述
有 件物品,第 件物品的重量为 (整数)。
对于给定的整数 , 请选择一些物品,使得拼出的重量不超过 ,请问在此前提下能拼出的最大重量是多少?具体的方案是怎样的?
输入格式
输入的第一行包含一个整数 ,表示物品数量。
第二行包含 个整数 , , , ,分别为每个物品的重量。
最后一行包含一个整数 。
输出格式
输出的第一行包含一个整数 ,表示答案。
第二行包含一个整数 ,表示要选择的物品个数。
第三行包含 个整数,为每个选择的物品的编号,按照从小到大的顺序输出,相邻整数之间使用一个空格分隔。
样例输入
3
4 4 6
12
Data
样例输出
10
2
1 3
Data
以下答案也正确
10
2
2 3
这道背包问题我一开始打算用回溯做,但会超时和错误,现在打算还是老老实实用背包做,请各方神圣帮本蒟蒻看看吧!
急!在线蹲答案!
这是背包的模板,你看着改下吧,不懂的看下这篇文章:https://blog.csdn.net/aliyonghang/article/details/128047851
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];//v数组存储体积,w数组存储价值
int f[N][N];
int main ()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
{
f[i][j]=f[i-1][j];//将不能放入第i件物品的情况和能放入但是没放入的情况合并
if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
}
cout<<f[n][m]<<endl;
return 0;
}