#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=10;
const int MAXW=100;
int w[MAXW]; //货物的重量
int v[MAXN]; //货物的价值
int dp[MAXN][MAXW];
int n,c; //货物的数量和价值
void traceback();
void detail();
int main()
{
cin>>n>>c;
cout<<"输入货物的重量和价值"<<endl;
for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
for(int i=1;i<=n;i++)
{
for(int j=0;j<=c;j++)
{
if(w[i]>j)
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
}
}
cout<<dp[n][c]<<endl;
traceback();
detail();
}
void detail()
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<=c;j++)
cout<<dp[i][j]<<" ";
cout<<endl;
}
}
void traceback()
{
int x[MAXN];
int temp=c;
for(int i=n;i>=1;i--)
{
if(dp[i][temp]==dp[i-1][temp])
x[i]=0;
else
{
x[i]=1;
temp-=w[i];
}
}
for(int i=1;i<=n;i++)
if(x[i])
cout<<i<<" ";
cout<<endl;
}
/*
测试用例:
1 10
2 12
3 13
3 15
4 15
5 16
*/
01背包,动态规划
最新推荐文章于 2025-12-28 15:42:52 发布
1014

被折叠的 条评论
为什么被折叠?



