01背包(二维数组)+方案记录

来源:互联网 发布:js给value赋值 编辑:程序博客网 时间:2024/06/07 10:02
#include<cstdio>#include<iomanip>#include<iostream>#include<cstring>using namespace std;int p[100];int h[100];int f[100][100];int w[100];int c[100][100];int N,V;void cal(){int j=V;for(int i=N; i>=1; i--){//if(c[i][j] == c[i-1][j-w[i]] + p[i]){if(c[i][j] != c[i-1][j]){h[i]=1;//被选择的物体的编号标记为1j-=w[i];//j为除了被选择物体重量外的总重量}}}int main(){freopen("in.txt","r",stdin);int T;scanf("%d",&T);//测试组数while(T--){int i,j;scanf("%d%d",&N,&V);//数量和总重量memset(c,0,sizeof(c));memset(f,0,sizeof(f));for(i=1; i<=N; i++)//价值scanf("%d",&p[i]);for(i=1; i<=N; i++)//重量scanf("%d",&w[i]);for(i=1; i<=N; i++){for(j=0; j<=V; j++){if(w[i]>j){ c[i][j]=c[i-1][j]; continue; }if(c[i-1][j-w[i]] + p[i] > c[i-1][j]){//放c[i][j] = c[i-1][j-w[i]] + p[i];f[i][j]=1;//方法2}else c[i][j] = c[i-1][j];//不放}}for(i=1; i<=N; i++){for(j=1; j<=V; j++){cout<<left<<setw(5)<<c[i][j]<<" ";}cout<<endl;}cout<<endl;cal();//方法1/*j=V;//方法2for(i=N; i>=1; i--){if(f[i][j]){cout<<i<<" ";j-=w[i];}}*/cout<<endl<<endl;;printf("%d\n",c[N][V]);}return 0;}
看到别人不是用C写的,改动下。不使用滚动数组基本是这样记录了~有木有其他方法。。。
0 0
原创粉丝点击