//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;
}