#include<string>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
/***********************
背包问题,二维数组和一维数组
************************/
#if 0
#define MAX 100
int weight[MAX];
int value[MAX];
int maxsum[MAX];
int main(){
int i,j;
int N,C;
cin>>N>>C;
for(i=1;i<=N;i++)
{
cin>>weight[i]>>value[i];
cout<<"**********************"<<endl;
}
#if 0
for(i=1;i<=N;i++)
{
int c=1;
while(c<weight[i]){
maxsum[i][c]=maxsum[i-1][c];
c++;
}
for(c=weight[i];c<=C;c++)
{
maxsum[i][c]=max(maxsum[i-1][c],maxsum[i-1][c-weight[i]]+value[i]);
}
}
cout<<maxsum[N][C];
#endif
#if 1
for(i=1;i<=N;i++)
{
int c=C;
while(c>=weight[i]){
maxsum[c]=max(maxsum[c],maxsum[c-weight[i]]+value[i]);
c--;
}
}
cout<<maxsum[C];
#endif
return 0;
}
#endif
/******************************
完全背包的解决
*******************************/
#define MAX 100
int weight[MAX];
int value[MAX];
int maxsum[MAX][MAX];
int main(){
int i,j;
int N,C;
cin>>N>>C;
for(i=1;i<=N;i++)
{
cin>>weight[i]>>value[i];
cout<<"**********************"<<endl;
}
for(i=1;i<=N;i++)
{
for(int c=0;c<=C;c++)
{
for(int k=0;k<=c/weight[i];k++)
{
maxsum[i][c]=max(maxsum[i][c],maxsum[i-1][c-k*weight[i]]+k*value[i]);
}
}
}
/*******************************
完全背包算法优化
*******************************/
/*
for(i=1;i<=N;i++)
{
for(int c=0;c<=C;c++)
{
maxsum[i][c]=max(maxsum[i][c],maxsum[i-1][c-weight[i]]+value[i]);
}
}
*/
for(i=0;i<=N;i++)
{
for(j=0;j<=C;j++)
{
cout<<maxsum[i][j]<<" ";
}
cout<<endl;
}
cout<<maxsum[N][C];
return 0;
}
最长子序列
最新推荐文章于 2024-09-22 23:07:14 发布