• hdu1028 Ignatius and the Princess III


    题目链接

    solution

    此题有两种解法。

    第一种解法就是裸的完全背包。

    就相当于有n种物品,第i种物品的重量是i。每种物品有无限多个,问恰好填满一个容量为n的背包的方案数。

    第二种解法是生成函数。

    用生成函数((1+x+x^1+x^2+...))表示拆分出的(1)的数量。用((1+x^2+x^4+x^6+...))表示拆分出的(2)的数量。剩下的同理。最终(x^n)的系数就是答案。

    code

    解法1

    /*
    * @Author: wxyww
    * @Date:   2020-04-16 14:18:39
    * @Last Modified time: 2020-04-16 14:19:55
    */
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<ctime>
    using namespace std;
    typedef long long ll;
    
    ll read() {
    	ll x = 0,f = 1;char c = getchar();
    	while(c < '0' || c > '9') {
    		if(c == '-') f = -1; c = getchar();
    	}
    	while(c >= '0' && c <= '9') {
    		x = x * 10 + c - '0'; c = getchar();
    	}
    	return x * f;
    }
    int f[150];
    int main() {
    	int n;
    	while(~scanf("%d",&n)) {
    		memset(f,0,sizeof(f));
    		f[0] = 1;
    		for(int i = 1;i <= n;++i) {
    			for(int j = i;j <= n;++j) 
    				f[j] += f[j - i];
    		}
    		cout<<f[n]<<endl;
    	}
    
    	return 0;
    }
    

    解法2

    /*
    * @Author: wxyww
    * @Date:   2020-04-16 14:11:40
    * @Last Modified time: 2020-04-16 14:19:27
    */
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<ctime>
    using namespace std;
    typedef long long ll;
    const int N = 150;
    ll read() {
    	ll x = 0,f = 1;char c = getchar();
    	while(c < '0' || c > '9') {
    		if(c == '-') f = -1; c = getchar();
    	}
    	while(c >= '0' && c <= '9') {
    		x = x * 10 + c - '0'; c = getchar();
    	}
    	return x * f;
    }
    int f[N][N],tmp[N];
    int main() {
    	int n;
    	while(~scanf("%d",&n)) {
    		memset(f,0,sizeof(f));
    		for(int i = 0;i <= n;++i) f[1][i] = 1;
    		for(int t = 2;t <= n;++t) {
    			for(int i = 0;i <= n;++i) {
    				for(int k = 0;k + i <= n;k += t) {
    					f[t][i + k] += f[t - 1][i];
    				}
    			}
    		}
    		cout<<f[n][n]<<endl;
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    May LeetCoding Challenge22 之 比较器comparator、map按Value排成逆序、桶排序
    May LeetCoding Challenge21 之 动态规划的min使用
    May LeetCoding Challenge20 之 二叉树中序遍历
    May LeetCoding Challenge19 之 单调栈2.0
    May LeetCoding Challenge18 之 滑动窗口2.0
    May LeetCoding Challenge17 之 滑动窗口
    May LeetCoding Challenge16 之 链表重组
    APT常用命令
    DDCTF-misc-流量分析
    Wireshark学习笔记
  • 原文地址:https://www.cnblogs.com/wxyww/p/hdu1028.html
Copyright © 2020-2023  润新知