ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。
3 3 1 1 2 1 3 1 0 0
2
#include
#include
int a[2000];
int zxc(int n/*geshu*/,int v/*rongji*/,int c[2000]/*zhongliang*/,int w[2000]/*jiazhi*/)
{
memset(a,0,sizeof(a));
int i,j;
for(i=1; i<=n; i++)
for(j=v; j>=c[i]; j--)
{
a[j]=(w[i]+a[j-c[i]]>a[j]?w[i]+a[j-c[i]]:a[j]);
}
return a[v];
}
int c[2000],w[2000];
int main()
{
int n,v;
while(~scanf("%d%d",&n,&v))
{
if(n==0&&v==0)
break;
int i;
memset(c,0,sizeof(c));
memset(w,0,sizeof(w));
for(i=1; i<=n; i++)
scanf("%d%d",&c[i],&w[i]);
printf("%d\n",zxc(n,v,c,w));
}
return 0;
}
直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是c,价值是w。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。本题要求是背包恰好装满背包时,求出最大价值总和是多少。如果不能恰好装满背包,输出NO
2 1 5 2 2 2 5 2 2 5 1
NO 1
#include
#include
#include
int c[2009],w[2009],jia[50009],xia[50009];
using namespace std;
int main()
{
int n,v,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&v);
int i,j;
memset(jia,0,sizeof(jia));
memset(xia,0,sizeof(xia));
xia[0]=1;
for(i=1; i<=n; i++)
scanf("%d%d",&c[i],&w[i]);
for(i=1; i<=n; i++)
{
for(j=c[i]; j
优化的方案;
#include
#include
#include
using namespace std;
struct gg
{
int vi,mi;
} a[2009];
int b[3][50009];
int main()
{
int n,v,t;
cin>>t;
while(t--)
{
cin>>n>>v;
int i,sum=0,j;
memset(b,0,sizeof(b));
for(i=0; i>a[i].vi>>a[i].mi;
b[1][0]=1;
for(i=0; i
5 5 8 13 27 14
3
#include
#include
#include
#include
using namespace std;
int a[100009],b[100009];
int main()
{
int n;
while(cin>>n)
{
int i,sum=0,j;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=0;i>a[i],sum+=a[i];
for(i=0;i=a[i];j--)
{
b[j]=max(b[j-a[i]]+a[i],b[j]);
}
}
cout<
4 5 2 3 1 2 3 4 2 2
7
#include
#include
#include
int c[2009],w[2009],jia[50009];
using namespace std;
int main()
{
int n,v;
while(~scanf("%d%d",&n,&v))
{
int i,j,sum=0;
memset(jia,0x3f3f3f3f,sizeof(jia));
for(i=0; i=w[i]; j--)
jia[j]=min(jia[j-w[i]]+c[i],jia[j]);
}
for(i=sum;i>=0;i--)
{
if(jia[i]<=v)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}