hdu1203
简单的背包问题只是反向一下,基本套模板。然而实际上将
for(int i=0;i<m;i++)
{
for(int j=n;j>=w[i];j--)
{
f[j]=min(f[j],f[j-w[i]]*(1-v[i]));
}
}
{
for(int j=n;j>=w[i];j--)
{
f[j]=min(f[j],f[j-w[i]]*(1-v[i]));
}
}
在脑中实际模拟一遍,脑子有些不够用。还是按照宏观理解准备所有的物品,如果放入背包,则减去空间加上价值,如果不放,保持原样,再比大小。
#include <iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int w[10001];
double v[10001];
double f[10001];
double min(double a,double b)
{
return a<b?a:b;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
for(int i=0;i<=n;i++)
f[i]=1;
for(int i=0;i<m;i++)
{
cin>>w[i]>>v[i];
}
for(int i=0;i<m;i++)
{
for(int j=n;j>=w[i];j--)
{
f[j]=min(f[j],f[j-w[i]]*(1-v[i]));
}
}
printf("%.1lf%%\n",(1-f[n])*100);
}
return 0;
}
#include<cstring>
#include<stdio.h>
using namespace std;
int w[10001];
double v[10001];
double f[10001];
double min(double a,double b)
{
return a<b?a:b;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
for(int i=0;i<=n;i++)
f[i]=1;
for(int i=0;i<m;i++)
{
cin>>w[i]>>v[i];
}
for(int i=0;i<m;i++)
{
for(int j=n;j>=w[i];j--)
{
f[j]=min(f[j],f[j-w[i]]*(1-v[i]));
}
}
printf("%.1lf%%\n",(1-f[n])*100);
}
return 0;
}