讨论 / 用C语言怎么写,不用c++
假叔叔 2016-04-05 06:15:41
点我顶贴 收藏 删除
大神,求解

#1 周大侠43@2016-04-10 04:49:08
回复 删除
var

i,j,m,n:longint;

g:array[0..30000] of longint;w,v:array[1..25] of longint;

begin

readln(n,m);for i:=1 to m do read(v[i],w[i]);

for i:=1 to m do

for j:=n downto v[i] do

if g[j]<g[j-v[i]]+v[i]*w[i] then

g[j]:=g[j-v[i]]+v[i]*w[i];

writeln(g[n]);

end.

#2 假叔叔@2016-04-13 06:18:42
回复 删除
额,只是C语言吗?

#3 logan25@2016-07-16 20:18:33
回复 删除
#include <stdio.h>

int main()

{

int v[30],p[30],sum[300000];

int m,n,i,j;

scanf("%d%d",&n,&m);

for (i=1;i<=m;i++)

{

scanf("%d%d",&v[i],&p[i]);

}

for (i=1;i<=m;i++)

{

for (j=n;j>=v[i];j--)

{

if (sum[j]<sum[j-v[i]]+v[i]*p[i])

sum[j]=sum[j-v[i]]+v[i]*p[i];

}

}

printf("%d\n",sum[n]);

return 0;

}

#4 0043@2016-11-17 06:25:34
回复 删除
#include<stdio.h>

#include<limits.h> //别写错了是limits.h

//1.状态:i即横坐标表示价格v,j即纵坐标表示第i个物品,a[i][j]表示在价格为i时可以装的最多收益

//2.决策:a[i][j]=max(a[i-v[j]][j-1]+w[j],a[i][j-1])

//3.初始状态: 结束状态:answer=a[m][m]

//4.收益:v[i]*w[i]

//5.无后效性:满足

int a[30005][30];

int v[30],w[30];

int n,m,i,j,minv=INT_MAX,k,ans;

int main(){

scanf("%d%d",&n,&m); //总价钱n,物品总数m

for(i=1;i<=m;i++){

scanf("%d%d",&v[i],&w[i]);

if(v[i]<minv) minv=v[i];

}

for(i=0;i<=n+1;i++){

for(j=0;j<=m+1;j++){

a[i][j]=0;

}

}

for(j=1;j<=m;j++){

for(i=n;i>=0;i--){

if(v[j]>i) a[i][j]=a[i][j-1];

else a[i][j]=a[i-v[j]][j-1]+w[j]*v[j]>a[i][j-1]?a[i-v[j]][j-1]+w[j]*v[j]:a[i][j-1];

}

}

/*for(i=minv;i<=n;i++){

for(j=1;j<=m;j++){

printf("%d ",a[i][j]);

}

printf("\n");

}*/

ans=a[n][m];

/*for(k=n;k>=0;k--){

if(a[k][m]==a[k-1][m]) continue;

else {

printf("a[n][m]=%d\n",a[n][m]);

printf("k=%d\n",k);

ans=ans*k;

break;

}

}*/

//printf("ans=");

printf("%d\n",ans);

}

#5 黑白之恋@2017-09-13 04:41:54
回复 删除
回复 #3 logan25:两个输入里%d和%d要有空格,不然就得不出结果了

查看更多回复
提交回复