zoukankan      html  css  js  c++  java
  • HDU3033 I love sneakers!———分组背包

    这题的动态转移方程真是妙啊,完美的解决了每一种衣服必须买一件的情况。

    if(a[x][i-c[x][j].x]!=-1) a[x][i]=max(a[x][i],a[x][i-c[x][j].x]+c[x][j].y);
    if(a[x-1][i-c[x][j].x]!=-1) a[x][i]=max(a[x][i],a[x-1][i-c[x][j].x]+c[x][j].y);

    第一个if里的条件是如果该种物品已经被选,那么,就按照一般的背包问题讨论

    第二个if里的条件是如果上一种的物品被选,那么,就按照一般的背包问题讨论

    有了这两个if,就可以保证dp得出的值是一定满足条件的。当然,如果无法得出,那么最后的答案就会是初始值-1

    代码如下:

    #include<iostream>
    #include<string.h>
    #include<vector>
    using namespace std;
    struct dd
    {
    	int x;int y;
    }s;
    vector<dd> c[15];
    int main()
    {
    	long long a[15][10009],n,m,i,x,k,y,j,z;//maxx=0;
    	while(cin>>n>>m>>k)
    	{
    		memset(a,-1,sizeof(a));
    		memset(a[0],0,sizeof(a[0]));
    		for(i=1;i<=k;i++) c[i].clear();
    		for(i=1;i<=n;i++) 
    		{
    			cin>>x>>s.x>>s.y;
    			c[x].push_back(s);
    		//maxx+=b[i];
    		}
    		for(x=1;x<=k;x++)
    		{
    			for(j=0;j<c[x].size();j++)
    			{
    				for(i=m;i>=c[x][j].x;i--)
    				{
    					if(a[x][i-c[x][j].x]!=-1) a[x][i]=max(a[x][i],a[x][i-c[x][j].x]+c[x][j].y);
    					if(a[x-1][i-c[x][j].x]!=-1) a[x][i]=max(a[x][i],a[x-1][i-c[x][j].x]+c[x][j].y);
    				}
    			}
    		}
    		if(a[k][m]==-1) cout<<"Impossible"<<endl;
    		else cout<<a[k][m]<<endl;
    	}
    }
    

      

  • 相关阅读:
    CentOS 6.6 下源码编译安装MySQL 5.7.5
    CentOS 6.6下安装配置Tomcat环境
    Redhat6.7 切换Centos yum源
    css盒模型
    mysql 查询表占用空间大小
    ligerform 控件元素设置为只读
    FtpClient中文文件名下载失败问题
    java Runtime.exec() 执行问题
    java log4j动态生成log文件
    java udp地址匹配
  • 原文地址:https://www.cnblogs.com/wsblm/p/8605171.html
Copyright © 2011-2022 走看看