01背包的小变形。
这里值得注意的是:
01背包和完全背包在 求消费v,所得价值w最小情况的变形。
01背包 :f[0...v] = max;
然而 完全背包: f[0....v] = max ; f[0]=0; 这个原因应该是完全背包物品无限的吧~
#include <iostream>
#include <iomanip>
using namespace std;
struct pack
{
int c;
float w;
};
pack p[10001];
float f[10001];
int v;
void zpack( pack p)
{
for(int i=v;i>=p.c;i--)
if(f[i]>(f[i-p.c]*(1-p.w))) //每次写这里 都要特别注意!!
f[i]= f[i-p.c]*(1-p.w);
}
int main()
{
int n,m;
while(cin>>v>>m,m+v)
{
for(int i=1;i<=m;i++)
cin>>p[i].c>>p[i].w;
for(int i=0;i<=v;i++) f[i]=1;
// f[0]=0; 加上 wa了
for(int i=1;i<=m;i++)
zpack(p[i]);
cout<<setiosflags(ios::fixed)<<setprecision(1)<<(1-f[v])*100<<"%"<<endl;
}
return 0;
}