//01背包公式
f[j] = max{ f[j] , f[j-w(i)+v(i) }
上面的代码就改下了下面这样:
#include<iostream>
using namespace std;
#define V 1500
unsigned int f[V];//全局变量,自动初始化为0
unsigned int weight[10];
unsigned int value[10];
#define max(x,y) (x)>(y)?(x):(y)
int main()
{
int N,M;
cin>>N;//物品个数
cin>>M;//背包容量
for (int i=1;i<=N; i++)
{
cin>>weight[i]>>value[i];
}
for (int i=1; i<=N; i++)
for (int j=M; j>=1; j--)
{
if (weight[i]<=j)
{
f[j]=max(f[j],f[j-weight[i]]+value[i]);
}
}
cout<<f[M]<<endl;//输出最优解
}
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
//这是一个01背包问题,而且是有小数的,所以乘100,最后再除100
int coun[40];
const int maxn=30*100000+10;
int f[maxn];
double Q;
int main()
{
int N;
int m;
char ch;
int A,B,C;
double price;
int price1;
while(~scanf("%lf%d",&Q,&N)&&N)
{
memset(coun,0,sizeof(coun));
memset(f,0,sizeof(f));
int Q1=(int)(Q*100);
int sizen=1;
for(int i=1; i<=N; i++)
{
int ok=1;
A=B=C=0;
price1=0;
scanf("%d",&m);
for(int j=0; j<m; j++)
{
getchar();
scanf("%c:%lf",&ch,&price);
int price2=(int)(price*100);
if(ch=='A')
A+=price2;
else if(ch=='B')
B+=price2;
else if(ch=='C')
C+=price2;
else
ok=0;
price1+=price2;
}
if(A<=60000&&B<=60000&&C<=60000&&price1<=100000&&ok)
coun[sizen++]=price1;
}
for(int i=1; i<sizen; i++)
for(int j=Q1; j>=1; j--)
{
if(j>=coun[i])
f[j]=max(f[j],f[j-coun[i]]+coun[i]);
}
printf("%.2lf\n",f[Q1]*1.0/100.00);
}
return 0;
}
6万+

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



