6.0-1背包问题 (20分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
背包最大允许装载为C, 有n个物品要放进背包,每个物品的重量为w[1],w[2],...w[n],每个物品的价值为v[1],v[2],...v[n], 请选择物品装进背包,使得价值最大。C为整数。
输入描述
第一行为物体个数n,以及背包容量C;
第二行为n个重量(实数),空格隔开
第三行为n个价值(实数),空格隔开
输出描述
第一行为最大装载的总价值
第二行为每个物品是否装载,1表示装,0表示不装,中间用空格隔开
(测试数据能保证最优解唯一)
输入样例
5 10
2 2 6 5 4
6 3 5 4 6
输出样例
15
1 1 0 0 1
第一段代码没有通过:
#include <stdio.h>
int main(){
int i,j,m,n,w[100],p[100];
while(scanf("%d%d",&n,&m)!=EOF)
{
int c[100][100]={0},x[100]={0};
for(i=0;i<n;i++)
scanf("%d",&w[i]);
for(i=0;i<n;i++)
scanf("%d",&p[i]);
for(i=1;i<=n;i++)
for(j=m;j>=w[i-1];j--){
if(c[i-1][j]<(c[i-1][j-w[i-1]]+p[i-1]))
c[i][j] = c[i-1][j-w[i-1]]+p[i-1];
else
c[i][j] = c[i-1][j];
}
printf("%d\n",c[n][m]);
for(i=n;i>0;i--)
if(c[i][m]>c[i-1][m]){
x[i-1]=1;
m-=w[i-1];
}
for(j=0;j<n;j++)
{
printf("%d",x[j]);
if(j!=n-1)
printf(" ");
}
printf("\n");
}
return 0;
}
下面这段过了,
AC:已经不知道学校OJ,,怎么判题了。。
#include <iostream>
#include <cstdio>
using namespace std;
int dp[1000][1000];
int w[1000], v[1000];
int a[1000];
int main(){
int m, c;
cin >> m >> c;
for(int i = 1; i <= m; i++)
cin >> w[i];
for(int i = 1; i <= m; i++)
cin >> v[i];
for(int i = 1; i <= m; i++){
for(int j = 0; j <= c; j++){ //背包可以为0
if(i != 1)
dp[i][j] = dp[i - 1][j];
if(j >= w[i])
dp[i][j] = (dp[i][j] > dp[i - 1][j - w[i]] + v[i] ? dp[i][j] : dp[i - 1][j - w[i]] + v[i]);
cout << dp[i][j] << " ";
}
cout << endl;
}
cout << dp[m][c] << endl;
int b = c;
for(int i = m; i >= 1; i--){
if(dp[i][b] > dp[i - 1][b]){
a[i] = 1;
b -= w[i];
}
}
for(int i = 1; i <= m; i++)
cout << a[i] << " ";
return 0;
}